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.
18 #include "mtp_property.h"
19 #include "mtp_media_info.h"
20 #include "mtp_support.h"
21 #include "mtp_transport.h"
24 * EXTERN AND GLOBAL VARIABLES
26 obj_interdep_proplist_t interdep_proplist;
30 static obj_prop_desc_t props_list_mp3[NUM_OBJECT_PROP_DESC_MP3];
31 static obj_prop_desc_t props_list_wma[NUM_OBJECT_PROP_DESC_WMA];
32 static obj_prop_desc_t props_list_wmv[NUM_OBJECT_PROP_DESC_WMV];
33 static obj_prop_desc_t props_list_album[NUM_OBJECT_PROP_DESC_ALBUM];
34 static obj_prop_desc_t props_list_default[NUM_OBJECT_PROP_DESC_DEFAULT];
39 static mtp_uint16 __get_ptp_array_elem_size(data_type_t type);
40 static mtp_bool __check_object_propcode(obj_prop_desc_t *prop,
41 mtp_uint32 propcode, mtp_uint32 group_code);
42 static mtp_bool __create_prop_integer(mtp_obj_t *obj,
43 mtp_uint16 propcode, mtp_uint64 value);
44 static mtp_bool __create_prop_string(mtp_obj_t *obj, mtp_uint16 propcode,
46 static mtp_bool __create_prop_array(mtp_obj_t *obj, mtp_uint16 propcode,
47 mtp_char *arr, mtp_uint32 size);
48 #ifdef MTP_SUPPORT_PROPERTY_SAMPLE
49 static mtp_bool __create_prop_sample(mtp_obj_t *obj);
50 static void __build_supported_sample_props(mtp_uchar *count,
51 obj_prop_desc_t *prop);
52 #endif /*MTP_SUPPORT_PROPERTY_SAMPLE*/
53 static mtp_bool __update_prop_values_audio(mtp_obj_t *obj);
54 static mtp_bool __update_prop_values_video(mtp_obj_t *obj);
55 static mtp_bool __update_prop_values_image(mtp_obj_t *obj);
56 static mtp_bool __prop_common_metadata(mtp_obj_t *obj,
57 common_meta_t *p_metata);
58 static void __build_supported_common_props(mtp_uchar *count,
59 obj_prop_desc_t *prop);
60 /* PtpString Functions */
61 #ifndef MTP_USE_VARIABLE_PTP_STRING_MALLOC
62 static ptp_string_t *__alloc_ptpstring(void);
63 #else /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
64 static ptp_string_t *__alloc_ptpstring(mtp_uint32 size);
65 #endif /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
66 static void __init_obj_propval(obj_prop_val_t *val, obj_prop_desc_t *prop);
67 static void __init_ptptimestring(ptp_time_string_t *pstring);
68 static mtp_uint32 __size_curval_device_prop(device_prop_desc_t *prop);
69 static void __init_obj_prop_desc(obj_prop_desc_t *prop, mtp_uint16 propcode,
70 mtp_uint16 data_type, mtp_uchar get_set, mtp_uchar form_flag,
71 mtp_uint32 group_code);
72 static mtp_uint32 __get_size_default_val_obj_prop_desc(obj_prop_desc_t *prop);
73 static void __destroy_obj_prop_desc(obj_prop_desc_t *prop);
74 static mtp_uint32 __count_obj_proplist(obj_proplist_t *plist);
75 static mtp_bool __append_obj_proplist(obj_proplist_t *prop_list, mtp_uint32 obj_handle,
76 mtp_uint16 prop_code, mtp_uint32 data_type, mtp_uchar *val);
77 #ifdef MTP_SUPPORT_INTERDEPENDENTPROP
78 static mtp_bool __append_interdep_prop(interdep_prop_config_t *config,
79 obj_prop_desc_t *prop);
80 #endif /* MTP_SUPPORT_INTERDEPENDENTPROP */
81 static mtp_uint32 __count_interdep_proplist(obj_interdep_proplist_t *config_list,
82 mtp_uint32 format_code);
86 static mtp_bool __check_object_propcode(obj_prop_desc_t *prop,
87 mtp_uint32 propcode, mtp_uint32 group_code)
89 if ((prop->propinfo.prop_code == propcode) ||
90 ((propcode == PTP_PROPERTY_ALL) &&
91 !(prop->group_code & GROUP_CODE_SLOW)) ||
92 ((propcode == PTP_PROPERTY_UNDEFINED) &&
93 (prop->group_code & group_code))) {
100 static mtp_bool __create_prop_integer(mtp_obj_t *obj,
101 mtp_uint16 propcode, mtp_uint64 value)
103 obj_prop_desc_t *prop = NULL;
104 obj_prop_val_t *prop_val = NULL;
105 mtp_uint32 fmt_code = obj->obj_info->obj_fmt;
107 retv_if(obj == NULL, FALSE);
108 retv_if(obj->obj_info == NULL, FALSE);
110 prop = _prop_get_obj_prop_desc(fmt_code, propcode);
112 ERR("Create property Fail.. Prop = [0x%X]\n", propcode);
116 propvalue_alloc_and_check(prop_val);
117 _prop_set_current_integer_val(prop_val, value);
118 node_alloc_and_append();
123 static mtp_bool __create_prop_string(mtp_obj_t *obj, mtp_uint16 propcode,
126 ptp_string_t ptp_str = {0};
127 obj_prop_desc_t *prop = NULL;
128 obj_prop_val_t *prop_val = NULL;
129 mtp_uint32 fmt_code = obj->obj_info->obj_fmt;
131 retv_if(obj == NULL, FALSE);
132 retv_if(obj->obj_info == NULL, FALSE);
134 prop = _prop_get_obj_prop_desc(fmt_code, propcode);
136 ERR("Create property Fail.. Prop = [0x%X]\n", propcode);
140 propvalue_alloc_and_check(prop_val);
141 _prop_copy_char_to_ptpstring(&ptp_str, value, WCHAR_TYPE);
142 _prop_set_current_string_val(prop_val, &ptp_str);
143 node_alloc_and_append();
148 static mtp_bool __create_prop_timestring(mtp_obj_t *obj,
149 mtp_uint32 propcode, ptp_time_string_t *value)
151 obj_prop_desc_t *prop = NULL;
152 obj_prop_val_t *prop_val = NULL;
153 mtp_uint32 fmt_code = obj->obj_info->obj_fmt;
155 retv_if(obj == NULL, FALSE);
156 retv_if(obj->obj_info == NULL, FALSE);
158 prop = _prop_get_obj_prop_desc(fmt_code, propcode);
160 ERR("Create property Fail.. Prop = [0x%X]\n", propcode);
164 propvalue_alloc_and_check(prop_val);
165 _prop_set_current_string_val(prop_val, (ptp_string_t *)value);
166 node_alloc_and_append();
171 static mtp_bool __create_prop_array(mtp_obj_t *obj, mtp_uint16 propcode,
172 mtp_char *arr, mtp_uint32 size)
174 obj_prop_desc_t *prop = NULL;
175 obj_prop_val_t *prop_val = NULL;
176 mtp_uint32 fmt_code = obj->obj_info->obj_fmt;
178 retv_if(obj == NULL, FALSE);
179 retv_if(obj->obj_info == NULL, FALSE);
181 prop = _prop_get_obj_prop_desc(fmt_code, propcode);
183 ERR("Create property Fail.. Prop = [0x%X]\n", propcode);
187 propvalue_alloc_and_check(prop_val);
188 _prop_set_current_array_val(prop_val, (mtp_uchar *)arr, size);
189 node_alloc_and_append();
194 static mtp_bool __update_prop_values_audio(mtp_obj_t *obj)
196 mtp_bool success = TRUE;
197 mtp_int32 converted_rating = 0;
198 comp_audio_meta_t audio_data = {{0}, {0} };
200 retv_if(obj == NULL, FALSE);
201 retv_if(obj->obj_info == NULL, FALSE);
203 if (_util_get_audio_metadata(obj->file_path, &audio_data) == FALSE) {
204 if (_util_get_audio_meta_from_extractor(obj->file_path,
205 &audio_data) == FALSE) {
211 /*Update common metadata information*/
212 if (FALSE == __prop_common_metadata(obj,
213 &(audio_data.commonmeta))) {
214 ERR("Common metadata update Fail");
220 /*--------------TRACK--------------*/
221 if (FALSE == __create_prop_integer(obj,
222 MTP_OBJ_PROPERTYCODE_TRACK, audio_data.audiometa.track)) {
227 /*--------------USER RATING--------------*/
228 /* DCM rating -> MTP (WMP) rating */
229 switch (audio_data.commonmeta.rating) {
231 converted_rating = 1; /* 1-12 */
234 converted_rating = 25; /* 13-37 */
237 converted_rating = 50; /* 37-62 */
240 converted_rating = 75; /* 63-86 */
243 converted_rating = 99; /* 87-100 */
246 converted_rating = 0; /* otherwise */
250 if (FALSE == __create_prop_integer(obj,
251 MTP_OBJ_PROPERTYCODE_USERRATING, converted_rating)) {
257 /*-------------AUDIOWAVECODEC--------------*/
258 if (FALSE == __create_prop_integer(obj,
259 MTP_OBJ_PROPERTYCODE_AUDIOWAVECODEC,
260 MTP_WAVEFORMAT_UNKNOWN)) {
266 _util_free_common_meta(&(audio_data.commonmeta));
270 static mtp_bool __update_prop_values_video(mtp_obj_t *obj)
272 mtp_bool success = TRUE;
273 mtp_int32 converted_rating = 0;
274 comp_video_meta_t video_data = { {0,}, {0,} };
275 video_meta_t *viddata = &(video_data.videometa);
276 mtp_wchar buf[MTP_MAX_PATHNAME_SIZE + 1] = { 0 };
278 retv_if(obj == NULL, FALSE);
279 retv_if(obj->obj_info == NULL, FALSE);
280 retv_if(obj->file_path == NULL, FALSE);
282 if (_util_get_video_metadata(obj->file_path, &video_data) == FALSE) {
283 if (_util_get_video_meta_from_extractor(obj->file_path,
284 &video_data) == FALSE) {
290 /*Update common metadata information*/
291 if (FALSE == __prop_common_metadata(obj,
292 &(video_data.commonmeta))) {
293 ERR("Common metadata update Fail");
298 /*--------------TRACK--------------*/
299 if ((viddata->track != NULL) && strlen(viddata->track) > 0) {
300 if (FALSE == __create_prop_integer(obj,
301 MTP_OBJ_PROPERTYCODE_TRACK,
302 atoi(viddata->track))) {
308 /*--------------AUDIO WAVE CODEC--------------*/
309 if (FALSE == __create_prop_integer(obj,
310 MTP_OBJ_PROPERTYCODE_AUDIOWAVECODEC, 0)) {
315 /*--------------VIDEO CODEC--------------*/
317 * Conversion needs to be decided from audio_codec to
318 * exact format by spec
320 if (FALSE == __create_prop_integer(obj,
321 MTP_OBJ_PROPERTYCODE_VIDEOFOURCCCODEC, 0)) {
326 /*--------------VIDEO FRAMES PER 1K SECONDS--------------*/
327 if (FALSE == __create_prop_integer(obj,
328 MTP_OBJ_PROPERTYCODE_FRAMESPER1KSECONDS,
329 viddata->video_fps * 1000)) {
334 /*--------------VIDEO BITRATE--------------*/
335 if (FALSE == __create_prop_integer(obj,
336 MTP_OBJ_PROPERTYCODE_VIDEOBITRATE,
337 viddata->video_br)) {
342 /*--------------VIDEO WIDTH--------------*/
343 if (FALSE == __create_prop_integer(obj,
344 MTP_OBJ_PROPERTYCODE_WIDTH, viddata->video_w)) {
349 /*--------------VIDEO HEIGHT--------------*/
350 if (FALSE == __create_prop_integer(obj,
351 MTP_OBJ_PROPERTYCODE_HEIGHT, viddata->video_h)) {
356 /*--------------USER RATING--------------*/
357 switch (video_data.commonmeta.rating) {
359 converted_rating = 1; /* 1-12 */
362 converted_rating = 25; /* 13-37 */
365 converted_rating = 50; /* 37-62 */
368 converted_rating = 75; /* 63-86 */
371 converted_rating = 99; /* 87-100 */
374 converted_rating = 0; /* otherwise */
378 if (FALSE == __create_prop_integer(obj,
379 MTP_OBJ_PROPERTYCODE_USERRATING, converted_rating)) {
384 /*----------ENCODING PROFILE----------*/
385 _util_utf8_to_utf16(buf, sizeof(buf) / WCHAR_SIZ, "");
386 if (FALSE == __create_prop_string(obj,
387 MTP_OBJ_PROPERTYCODE_COPYRIGHTINFO, buf)) {
392 /*----------METAGENRE-----------*/
393 if (FALSE == __create_prop_integer(obj,
394 MTP_OBJ_PROPERTYCODE_METAGENRE, 0x00)) {
399 /*---------SCAN TYPE---------*/
400 if (FALSE == __create_prop_integer(obj,
401 MTP_OBJ_PROPERTYCODE_SCANTYPE, 0x00)) {
407 _util_free_common_meta(&(video_data.commonmeta));
408 _util_free_video_meta(&(video_data.videometa));
412 static mtp_bool __update_prop_values_image(mtp_obj_t *obj)
414 image_meta_t image_data;
416 retv_if(obj == NULL, FALSE);
417 retv_if(obj->obj_info == NULL, FALSE);
419 if (_util_get_image_ht_wt(obj->file_path, &image_data) == FALSE)
422 /*--------------IMAGE WIDTH--------------*/
423 if (FALSE == __create_prop_integer(obj, MTP_OBJ_PROPERTYCODE_WIDTH,
427 /*--------------IMAGE HEIGHT--------------*/
428 if (FALSE == __create_prop_integer(obj, MTP_OBJ_PROPERTYCODE_HEIGHT,
435 static mtp_bool __prop_common_metadata(mtp_obj_t *obj,
436 common_meta_t *p_metata)
438 mtp_wchar buf[MTP_MAX_PATHNAME_SIZE + 1] = { 0 };
440 /*--------------ARTIST--------------*/
441 if (p_metata->artist != NULL && strlen(p_metata->artist) > 0) {
442 _util_utf8_to_utf16(buf, sizeof(buf) / WCHAR_SIZ,
445 #ifdef MTP_USE_FILL_EMPTYMETADATA_WITH_UNKNOWN
447 DBG("got null artist");
448 _util_utf8_to_utf16(buf, sizeof(buf) / WCHAR_SIZ,
449 MTP_UNKNOWN_METADATA);
451 #endif /*MTP_USE_FILL_EMPTYMETADATA_WITH_UNKNOWN*/
453 if (FALSE == __create_prop_string(obj,
454 MTP_OBJ_PROPERTYCODE_ARTIST, buf)) {
458 /*--------------ALBUM--------------*/
459 if (p_metata->album != NULL && strlen(p_metata->album) > 0) {
460 _util_utf8_to_utf16(buf, sizeof(buf) / WCHAR_SIZ,
463 #ifdef MTP_USE_FILL_EMPTYMETADATA_WITH_UNKNOWN
465 DBG("got null album");
466 _util_utf8_to_utf16(buf, sizeof(buf) / WCHAR_SIZ,
467 MTP_UNKNOWN_METADATA);
469 #endif /*MTP_USE_FILL_EMPTYMETADATA_WITH_UNKNOWN*/
471 if (FALSE == __create_prop_string(obj,
472 MTP_OBJ_PROPERTYCODE_ALBUMNAME, buf)) {
476 /*--------------GENRE--------------*/
477 if (p_metata->genre != NULL && strlen(p_metata->genre) > 0) {
478 _util_utf8_to_utf16(buf, sizeof(buf) / WCHAR_SIZ,
481 #ifdef MTP_USE_FILL_EMPTYMETADATA_WITH_UNKNOWN
483 DBG("got null genre");
484 _util_utf8_to_utf16(buf, sizeof(buf) / WCHAR_SIZ,
485 MTP_UNKNOWN_METADATA);
487 #endif /*MTP_USE_FILL_EMPTYMETADATA_WITH_UNKNOWN*/
489 if (FALSE == __create_prop_string(obj,
490 MTP_OBJ_PROPERTYCODE_GENRE, buf)) {
494 /*--------------AUTHOR--------------*/
495 if (p_metata->author != NULL && strlen(p_metata->author) > 0) {
496 _util_utf8_to_utf16(buf, sizeof(buf) / WCHAR_SIZ,
499 #ifdef MTP_USE_FILL_EMPTYMETADATA_WITH_UNKNOWN
501 DBG("got null author");
502 _util_utf8_to_utf16(buf, sizeof(buf) / WCHAR_SIZ,
503 MTP_UNKNOWN_METADATA);
505 #endif /*MTP_USE_FILL_EMPTYMETADATA_WITH_UNKNOWN*/
507 if (FALSE == __create_prop_string(obj,
508 MTP_OBJ_PROPERTYCODE_COMPOSER, buf)) {
512 /*--------------COPYRIGHT--------------*/
513 if ((p_metata->copyright != NULL) && strlen(p_metata->copyright) > 0) {
514 _util_utf8_to_utf16(buf,
515 sizeof(buf) / WCHAR_SIZ,
516 p_metata->copyright);
518 _util_utf8_to_utf16(buf,
519 sizeof(buf) / WCHAR_SIZ, "");
522 if (FALSE == __create_prop_string(obj,
523 MTP_OBJ_PROPERTYCODE_COPYRIGHTINFO, buf)) {
527 /*--------------DURATION--------------*/
528 if (FALSE == __create_prop_integer(obj,
529 MTP_OBJ_PROPERTYCODE_DURATION, p_metata->duration)) {
533 /*--------------AUDIO BITRATE--------------*/
534 if (FALSE == __create_prop_integer(obj,
535 MTP_OBJ_PROPERTYCODE_AUDIOBITRATE, p_metata->audio_bitrate)) {
539 /*--------------RELEASE YEAR--------------*/
540 if ((p_metata->year != NULL) && strlen(p_metata->year) > 0) {
541 _util_utf8_to_utf16(buf,
542 sizeof(buf) / WCHAR_SIZ,
545 _util_utf8_to_utf16(buf,
546 sizeof(buf) / WCHAR_SIZ, "");
549 if (FALSE == __create_prop_string(obj,
550 MTP_OBJ_PROPERTYCODE_ORIGINALRELEASEDATE, buf)) {
554 /*--------------DESCRIPTION--------------*/
555 if ((p_metata->description != NULL) &&
556 strlen(p_metata->description) > 0) {
557 _util_utf8_to_utf16(buf,
558 sizeof(buf) / WCHAR_SIZ,
559 p_metata->description);
561 _util_utf8_to_utf16(buf,
562 sizeof(buf) / WCHAR_SIZ, "");
565 if (FALSE == __create_prop_string(obj,
566 MTP_OBJ_PROPERTYCODE_DESCRIPTION, buf)) {
570 /*--------------SAMPLE RATE--------------*/
571 if (FALSE == __create_prop_integer(obj,
572 MTP_OBJ_PROPERTYCODE_SAMPLERATE, p_metata->sample_rate)) {
576 /*-------------NUMBEROFCHANNELS--------------*/
577 if (FALSE == __create_prop_integer(obj,
578 MTP_OBJ_PROPERTYCODE_NUMBEROFCHANNELS, p_metata->num_channel)) {
585 static void __build_supported_common_props(mtp_uchar *count,
586 obj_prop_desc_t *prop)
589 mtp_wchar str[MTP_MAX_REG_STRING + 1] = { 0 };
590 mtp_uint32 default_val;
592 _util_utf8_to_utf16(str, sizeof(str) / WCHAR_SIZ, "");
595 * MTP_OBJ_PROPERTYCODE_ARTIST (1)
597 __init_obj_prop_desc((prop + i),
598 MTP_OBJ_PROPERTYCODE_ARTIST,
600 PTP_PROPGETSET_GETONLY,
602 MTP_PROP_GROUPCODE_OBJECT);
603 _prop_set_default_string(&(prop[i].propinfo), str);
607 * MTP_OBJ_PROPERTYCODE_DURATION (2)
609 __init_obj_prop_desc((prop + i),
610 MTP_OBJ_PROPERTYCODE_DURATION,
612 PTP_PROPGETSET_GETONLY,
614 MTP_PROP_GROUPCODE_OBJECT);
617 _prop_set_range_integer(&(prop[i].propinfo), 0, 0xffffffff, 1L);
618 _prop_set_default_integer(&((prop[i].propinfo)), (mtp_uchar *) &default_val);
622 * MTP_OBJ_PROPERTYCODE_USERRATING (3)
624 __init_obj_prop_desc((prop + i),
625 MTP_OBJ_PROPERTYCODE_USERRATING,
627 PTP_PROPGETSET_GETONLY,
629 MTP_PROP_GROUPCODE_OBJECT);
632 _prop_set_range_integer(&(prop[i].propinfo), 0, 100, 1L);
633 _prop_set_default_integer(&(prop[i].propinfo),
634 (mtp_uchar *) &default_val);
638 * MTP_OBJ_PROPERTYCODE_TRACK (4)
640 __init_obj_prop_desc((prop + i),
641 MTP_OBJ_PROPERTYCODE_TRACK,
643 PTP_PROPGETSET_GETONLY,
645 MTP_PROP_GROUPCODE_OBJECT);
648 _prop_set_default_integer(&(prop[i].propinfo),
649 (mtp_uchar *) &default_val);
653 * MTP_OBJ_PROPERTYCODE_GENRE (5)
655 __init_obj_prop_desc((prop + i),
656 MTP_OBJ_PROPERTYCODE_GENRE,
658 PTP_PROPGETSET_GETONLY,
660 MTP_PROP_GROUPCODE_OBJECT);
661 _prop_set_default_string(&(prop[i].propinfo), str);
665 * MTP_OBJ_PROPERTYCODE_ORIGINALRELEASEDATE (6)
667 __init_obj_prop_desc((prop + i),
668 MTP_OBJ_PROPERTYCODE_ORIGINALRELEASEDATE,
670 PTP_PROPGETSET_GETONLY,
672 MTP_PROP_GROUPCODE_OBJECT);
673 _prop_set_default_string(&(prop[i].propinfo), str);
677 * MTP_OBJ_PROPERTYCODE_ALBUMNAME (7)
679 __init_obj_prop_desc((prop + i),
680 MTP_OBJ_PROPERTYCODE_ALBUMNAME,
682 PTP_PROPGETSET_GETONLY,
684 MTP_PROP_GROUPCODE_OBJECT);
685 _prop_set_default_string(&(prop[i].propinfo), str);
689 * MTP_OBJ_PROPERTYCODE_COMPOSER (8)
691 __init_obj_prop_desc((prop + i),
692 MTP_OBJ_PROPERTYCODE_COMPOSER,
694 PTP_PROPGETSET_GETONLY,
696 MTP_PROP_GROUPCODE_OBJECT);
697 _prop_set_default_string(&(prop[i].propinfo), str);
705 /* PTP Array Functions */
706 void _prop_init_ptparray(ptp_array_t *parray, data_type_t type)
712 size = __get_ptp_array_elem_size(type);
716 parray->array_entry = g_malloc(size * INITIAL_ARRAY_SIZE);
717 if (parray->array_entry == NULL) {
718 parray->arr_size = 0;
720 parray->arr_size = INITIAL_ARRAY_SIZE;
721 memset(parray->array_entry, 0, size * INITIAL_ARRAY_SIZE);
726 ptp_array_t *_prop_alloc_ptparray(data_type_t type)
729 parray = (ptp_array_t *)g_malloc(sizeof(ptp_array_t));
731 _prop_init_ptparray(parray, type);
736 mtp_uint32 _prop_get_size_ptparray(ptp_array_t *parray)
740 if (parray == NULL) {
741 ERR("ptp_array_t is NULL");
745 size = __get_ptp_array_elem_size(parray->type);
749 return (sizeof(mtp_uint32) + (size *parray->num_ele));
752 mtp_uint32 _prop_get_size_ptparray_without_elemsize(ptp_array_t *parray)
756 size = __get_ptp_array_elem_size(parray->type);
760 return (size * parray->num_ele);
763 mtp_bool _prop_grow_ptparray(ptp_array_t *parray, mtp_uint32 new_size)
767 size = __get_ptp_array_elem_size(parray->type);
771 if (parray->arr_size == 0)
772 _prop_init_ptparray(parray, parray->type);
774 if (new_size < parray->arr_size)
777 parray->array_entry =
778 g_realloc(parray->array_entry, size * new_size);
779 if (parray->array_entry == NULL) {
780 parray->arr_size = 0;
783 parray->arr_size = new_size;
788 mtp_int32 _prop_find_ele_ptparray(ptp_array_t *parray, mtp_uint32 element)
790 mtp_uchar *ptr8 = NULL;
791 mtp_uint16 *ptr16 = NULL;
792 mtp_uint32 *ptr32 = NULL;
795 retv_if(parray->array_entry == NULL, ELEMENT_NOT_FOUND);
797 switch (parray->type) {
799 ptr8 = parray->array_entry;
800 for (ii = 0; ii < parray->num_ele; ii++) {
801 if (ptr8[ii] == (mtp_uchar) element)
807 ptr16 = parray->array_entry;
808 for (ii = 0; ii < parray->num_ele; ii++) {
809 if (ptr16[ii] == (mtp_uint16) element)
816 ptr32 = parray->array_entry;
817 for (ii = 0; ii < parray->num_ele; ii++) {
818 if (ptr32[ii] == (mtp_uint32)element)
826 return ELEMENT_NOT_FOUND;
829 mtp_bool _prop_get_ele_ptparray(ptp_array_t *parray, mtp_uint32 index, void *ele)
831 mtp_uchar *ptr8 = NULL;
832 mtp_uint16 *ptr16 = NULL;
833 mtp_uint32 *ptr32 = NULL;
835 retv_if(parray->array_entry == NULL, FALSE);
837 if (index >= parray->num_ele)
840 switch (parray->type) {
842 ptr8 = parray->array_entry;
843 *((mtp_uchar *)ele) = ptr8[index];
846 ptr16 = parray->array_entry;
847 *((mtp_uint16 *)ele) = ptr16[index];
852 ptr32 = parray->array_entry;
853 *((mtp_uint32 *)ele) = ptr32[index];
861 mtp_bool _prop_append_ele_ptparray(ptp_array_t *parray, mtp_uint32 element)
864 mtp_uchar *ptr8 = NULL;
865 mtp_uint16 *ptr16 = NULL;
866 mtp_uint32 *ptr32 = NULL;
868 if (parray->num_ele >= parray->arr_size) {
869 ERR("parray->num_ele [%d] is bigger than parray->arr_size [%d]\n",
870 parray->num_ele, parray->arr_size);
871 if (FALSE == _prop_grow_ptparray(parray,
872 ((parray->arr_size * 3) >> 1) + 2))
876 switch (parray->type) {
878 ptr8 = parray->array_entry;
879 ptr8[parray->num_ele++] = (mtp_uchar)element;
883 ptr16 = parray->array_entry;
884 ptr16[parray->num_ele++] = (mtp_uint16) element;
889 ptr32 = parray->array_entry;
890 ptr32[parray->num_ele++] = (mtp_uint32)element;
900 mtp_bool _prop_append_ele128_ptparray(ptp_array_t *parray, mtp_uint64 *element)
902 mtp_uchar *ptr = NULL;
903 mtp_bool ret = FALSE;
904 if (parray->num_ele >= parray->arr_size) {
905 if (FALSE == _prop_grow_ptparray(parray,
906 ((parray->arr_size * 3) >> 1) + 2))
910 switch (parray->type) {
912 ptr = parray->array_entry;
913 memcpy(&(ptr[(parray->num_ele * 16)]), element,
914 sizeof(mtp_uint64) * 2);
926 mtp_bool _prop_copy_ptparray(ptp_array_t *dst, ptp_array_t *src)
928 mtp_uchar *ptr8src = NULL;
929 mtp_uint16 *ptr16src = NULL;
930 mtp_uint32 *ptr32src = NULL;
933 dst->type = src->type;
937 ptr8src = src->array_entry;
938 for (ii = 0; ii < src->num_ele; ii++)
939 _prop_append_ele_ptparray(dst, ptr8src[ii]);
943 ptr16src = src->array_entry;
944 for (ii = 0; ii < src->num_ele; ii++)
945 _prop_append_ele_ptparray(dst, ptr16src[ii]);
950 ptr32src = src->array_entry;
951 for (ii = 0; ii < src->num_ele; ii++)
952 _prop_append_ele_ptparray(dst, ptr32src[ii]);
961 mtp_uint32 _prop_pack_ptparray(ptp_array_t *parray, mtp_uchar *buf,
964 if (parray == NULL || buf == NULL) {
965 ERR("pArray or buf is NULL");
971 size = __get_ptp_array_elem_size(parray->type);
975 if ((buf == NULL) || (bufsize < (sizeof(mtp_uint32) +
976 parray->num_ele * size)))
979 memcpy(buf, &(parray->num_ele), sizeof(mtp_uint32));
980 #ifdef __BIG_ENDIAN__
981 _util_conv_byte_order(buf, sizeof(mtp_uint32));
982 #endif /* __BIG_ENDIAN__ */
984 if (parray->num_ele != 0) {
985 #ifdef __BIG_ENDIAN__
987 mtp_uchar *temp = buf + sizeof(mtp_uint32);
988 mtp_uchar *ptr_entry = parray->array_entry;
990 for (ii = 0; ii < parray->num_ele; ii++) {
991 memcpy(temp, ptr_entry, size);
992 _util_conv_byte_order(temp, size);
996 #else /* __BIG_ENDIAN__ */
997 memcpy(buf + sizeof(mtp_uint32), parray->array_entry,
998 parray->num_ele * size);
999 #endif /* __BIG_ENDIAN__ */
1001 return (sizeof(mtp_uint32) + parray->num_ele * size);
1004 mtp_uint32 _prop_pack_ptparray_without_elemsize(ptp_array_t *parray,
1005 mtp_uchar *buf, mtp_uint32 bufsize)
1007 mtp_uint16 size = 1;
1008 #ifdef __BIG_ENDIAN__
1011 #endif /* __BIG_ENDIAN__ */
1013 size = __get_ptp_array_elem_size(parray->type);
1017 if ((buf == NULL) || (bufsize < (parray->num_ele * size)))
1020 if (parray->num_ele != 0)
1021 memcpy(buf, parray->array_entry, parray->num_ele * size);
1023 #ifdef __BIG_ENDIAN__
1024 /* Swap all the elements */
1026 for (ii = 0; ii < parray->num_ele; ii++) {
1027 _util_conv_byte_order(temp, size);
1030 #endif /* __BIG_ENDIAN__ */
1032 return (parray->num_ele * size);
1035 mtp_bool _prop_rem_elem_ptparray(ptp_array_t *parray, mtp_uint32 element)
1037 mtp_uchar *ptr8 = NULL;
1038 mtp_uint16 *ptr16 = NULL;
1039 mtp_uint32 *ptr32 = NULL;
1042 ii = _prop_find_ele_ptparray(parray, element);
1044 if (ii == ELEMENT_NOT_FOUND)
1047 switch (parray->type) {
1049 ptr8 = parray->array_entry;
1050 for (; ii < (parray->num_ele - 1); ii++)
1051 ptr8[ii] = ptr8[ii + 1];
1055 ptr16 = parray->array_entry;
1056 for (; ii < (parray->num_ele - 1); ii++)
1057 ptr16[ii] = ptr16[ii + 1];
1061 ptr32 = parray->array_entry;
1062 for (; ii < (parray->num_ele - 1); ii++)
1063 ptr32[ii] = ptr32[ii + 1];
1067 ptr32 = parray->array_entry;
1068 for (; ii < (parray->num_ele - 1); ii++)
1069 ptr32[ii] = ptr32[ii + 1];
1082 void _prop_deinit_ptparray(ptp_array_t *parray)
1084 parray->num_ele = 0;
1085 parray->arr_size = 0;
1086 if (parray->array_entry)
1087 g_free(parray->array_entry);
1089 parray->array_entry = NULL;
1093 void _prop_destroy_ptparray(ptp_array_t *parray)
1098 if (parray->array_entry != NULL)
1099 g_free(parray->array_entry);
1101 parray->arr_size = 0;
1102 parray->num_ele = 0;
1107 mtp_uint16 __get_ptp_array_elem_size(data_type_t type)
1109 mtp_uint16 size = 0;
1133 /* PtpString Functions */
1134 #ifndef MTP_USE_VARIABLE_PTP_STRING_MALLOC
1135 static ptp_string_t *__alloc_ptpstring(void)
1137 ptp_string_t *pstring = NULL;
1139 pstring = (ptp_string_t *)g_malloc(sizeof(ptp_string_t));
1140 if (pstring != NULL)
1141 _prop_init_ptpstring(pstring);
1145 #else /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
1146 static ptp_string_t *__alloc_ptpstring(mtp_uint32 size)
1148 ptp_string_t *pstring = NULL;
1149 mtp_int32 size_tmp = 0;
1150 mtp_int32 alloc_size = 0;
1152 size_tmp = sizeof(wchar_t) * size + sizeof(wchar_t) * 2;
1153 alloc_size = ((size_tmp >> 5) + 1) << 5; /* multiple of 32 */
1155 pstring = (ptp_string_t *)g_malloc(alloc_size); /* for margin */
1156 if (pstring != NULL)
1157 _prop_init_ptpstring(pstring);
1161 #endif /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
1163 void _prop_init_ptpstring(ptp_string_t *pstring)
1165 pstring->num_chars = 0;
1169 static void __init_ptptimestring(ptp_time_string_t *pstring)
1171 pstring->num_chars = 0;
1174 void _prop_copy_char_to_ptpstring(ptp_string_t *pstring, void *str,
1177 if (pstring == NULL)
1180 mtp_char *pchar = NULL;
1181 mtp_wchar *pwchar = NULL;
1184 pchar = (mtp_char *)str;
1185 pwchar = (mtp_wchar *)str;
1188 pstring->num_chars = 0;
1192 if (cmode == CHAR_TYPE) {
1193 if (pchar[0] == 0) {
1194 pstring->num_chars = 0;
1197 for (i = 0; i < MAX_PTP_STRING_CHARS && pchar[i]; i++)
1198 pstring->str[i] = (mtp_wchar)pchar[i];
1199 } else if (cmode == WCHAR_TYPE) {
1200 if (pwchar[0] == 0) {
1201 pstring->num_chars = 0;
1204 for (i = 0; i < MAX_PTP_STRING_CHARS && pwchar[i]; i++)
1205 pstring->str[i] = pwchar[i];
1207 ERR("Unknown character mode : %d\n", cmode);
1208 pstring->num_chars = 0;
1212 if (i == MAX_PTP_STRING_CHARS)
1213 pstring->num_chars = i;
1215 pstring->num_chars = i + 1;
1217 pstring->str[pstring->num_chars - 1] = (mtp_wchar)0;
1222 void _prop_copy_time_to_ptptimestring(ptp_time_string_t *pstring,
1223 system_time_t *sys_time)
1225 char time[17] = { 0 };
1227 if (sys_time == NULL) {
1228 __init_ptptimestring(pstring);
1230 #if defined(NEED_TO_PORT)
1231 _util_wchar_swprintf(pstring->str, sizeof(pstring->str) / WCHAR_SIZ,
1232 "%04d%02d%02dT%02d%02d%02d.%01d",
1233 sys_time->year, sys_time->month,
1234 sys_time->day, sys_time->hour,
1235 sys_time->minute, sys_time->second,
1236 (sys_time->millisecond) / 100);
1238 g_snprintf(time, sizeof(time), "%04d%02d%02dT%02d%02d%02d.%01d",
1239 sys_time->year, sys_time->month, sys_time->day,
1240 sys_time->hour, sys_time->minute,
1241 sys_time->second, (sys_time->millisecond) / 100);
1243 _util_utf8_to_utf16(pstring->str, sizeof(pstring->str) / WCHAR_SIZ, time);
1245 pstring->num_chars = 17;
1246 pstring->str[17] = '\0';
1251 void _prop_copy_ptpstring(ptp_string_t *dst, ptp_string_t *src)
1255 dst->num_chars = src->num_chars;
1256 for (ii = 0; ii < src->num_chars; ii++)
1257 dst->str[ii] = src->str[ii];
1262 void _prop_copy_ptptimestring(ptp_time_string_t *dst, ptp_time_string_t *src)
1266 dst->num_chars = src->num_chars;
1267 for (ii = 0; ii < src->num_chars; ii++)
1268 dst->str[ii] = src->str[ii];
1273 mtp_bool _prop_is_equal_ptpstring(ptp_string_t *dst, ptp_string_t *src)
1277 if (dst->num_chars != src->num_chars)
1280 for (ii = 0; ii < dst->num_chars; ii++) {
1281 if (dst->str[ii] != src->str[ii])
1287 mtp_uint32 _prop_size_ptpstring(ptp_string_t *pstring)
1289 if (pstring == NULL)
1292 return (pstring->num_chars * sizeof(mtp_wchar) + 1);
1295 mtp_uint32 _prop_size_ptptimestring(ptp_time_string_t *pstring)
1297 if (pstring == NULL)
1300 return (pstring->num_chars * sizeof(mtp_wchar) + 1);
1303 mtp_uint32 _prop_pack_ptpstring(ptp_string_t *pstring, mtp_uchar *buf,
1306 mtp_uint32 bytes_written = 0;
1308 mtp_uchar *pchar = NULL;
1309 #ifdef __BIG_ENDIAN__
1310 mtp_wchar conv_str[MAX_PTP_STRING_CHARS];
1311 #endif /* __BIG_ENDIAN__ */
1313 if ((buf == NULL) || (pstring == NULL) || (size == 0) ||
1314 (size < _prop_size_ptpstring(pstring))) {
1315 return bytes_written;
1318 if (pstring->num_chars == 0) {
1322 #ifdef __BIG_ENDIAN__
1323 memcpy(conv_str, pstring->str,
1324 pstring->num_chars * sizeof(mtp_wchar));
1325 _util_conv_byte_orderForWString(conv_str, pstring->num_chars);
1326 pchar = (mtp_uchar *) conv_str;
1327 #else /* __BIG_ENDIAN__ */
1328 pchar = (mtp_uchar *) pstring->str;
1329 #endif /* __BIG_ENDIAN__ */
1330 buf[0] = pstring->num_chars;
1332 bytes_written = _prop_size_ptpstring(pstring);
1333 for (ii = 0; ii < (bytes_written - 1); ii++)
1334 buf[ii + 1] = pchar[ii];
1336 return bytes_written;
1339 mtp_uint32 _prop_pack_ptptimestring(ptp_time_string_t *pstring, mtp_uchar *buf,
1342 mtp_uint32 bytes_written = 0;
1343 mtp_uchar *pchar = NULL;
1344 #ifdef __BIG_ENDIAN__
1345 mtp_wchar conv_str[MAX_PTP_STRING_CHARS];
1346 #endif /* __BIG_ENDIAN__ */
1348 if ((buf == NULL) || (pstring == NULL) || (size == 0) ||
1349 (size < _prop_size_ptptimestring(pstring))) {
1350 return bytes_written;
1353 if (pstring->num_chars == 0) {
1357 #ifdef __BIG_ENDIAN__
1358 memcpy(conv_str, pstring->str,
1359 pstring->num_chars * sizeof(mtp_wchar));
1360 _util_conv_byte_order_wstring(conv_str, pstring->num_chars);
1361 pchar = (mtp_uchar *)conv_str;
1362 #else /* __BIG_ENDIAN__ */
1363 pchar = (mtp_uchar *)pstring->str;
1364 #endif /* __BIG_ENDIAN__ */
1365 buf[0] = pstring->num_chars;
1367 bytes_written = _prop_size_ptptimestring(pstring);
1369 memcpy(&buf[1], pchar, bytes_written - 1);
1372 return bytes_written;
1375 mtp_uint32 _prop_parse_rawstring(ptp_string_t *pstring, mtp_uchar *buf,
1384 pstring->num_chars = 0;
1387 pstring->num_chars = buf[0];
1388 ii = (mtp_uint16) ((size - 1) / sizeof(mtp_wchar));
1389 if (pstring->num_chars > ii)
1390 pstring->num_chars = (mtp_uchar)ii;
1392 for (ii = 1; ii <= pstring->num_chars; ii++) {
1393 #ifdef __BIG_ENDIAN__
1394 pstring->str[ii - 1] =
1395 buf[2 * ii] | (buf[2 * ii - 1] << 8);
1396 #else /* __BIG_ENDIAN__ */
1397 pstring->str[ii - 1] =
1398 buf[2 * ii - 1] | (buf[2 * ii] << 8);
1399 #endif /* __BIG_ENDIAN__ */
1401 pstring->str[pstring->num_chars - 1] = (mtp_wchar) 0;
1402 return _prop_size_ptpstring(pstring);
1406 void _prop_destroy_ptpstring(ptp_string_t *pstring)
1408 if (pstring != NULL)
1414 mtp_bool _prop_is_valid_integer(prop_info_t *prop_info, mtp_uint64 value)
1416 if ((prop_info->data_type & PTP_DATATYPE_VALUEMASK) !=
1417 PTP_DATATYPE_VALUE) {
1421 if (prop_info->form_flag == RANGE_FORM) {
1422 if ((value >= prop_info->range.min_val) &&
1423 (value <= prop_info->range.max_val)) {
1429 } else if (prop_info->form_flag == ENUM_FORM) {
1430 slist_node_t *node = prop_info->supp_value_list.start;
1432 for (ii = 0; ii < prop_info->supp_value_list.nnodes;
1433 ii++, node = node->link) {
1434 if (value == (mtp_uint32) node->value)
1438 /* if it hits here, must be an invalid value */
1440 } else if (prop_info->form_flag == NONE) {
1441 /* No restrictions */
1445 /* shouldn't be here */
1449 mtp_bool _prop_is_valid_string(prop_info_t *prop_info, ptp_string_t *pstring)
1451 if ((prop_info->data_type != PTP_DATATYPE_STRING) || (pstring == NULL))
1454 if (prop_info->form_flag == ENUM_FORM) {
1455 slist_node_t *node = NULL;
1457 ptp_string_t *ele_str = NULL;
1459 node = prop_info->supp_value_list.start;
1460 for (ii = 0; ii < prop_info->supp_value_list.nnodes;
1461 ii++, node = node->link) {
1462 ele_str = (ptp_string_t *) node->value;
1463 if (ele_str != NULL) {
1464 if (_prop_is_equal_ptpstring(pstring, ele_str)) {
1465 /* value found in the list of supported values */
1470 /* if it hits here, must be an invalid value */
1472 } else if (prop_info->form_flag == NONE) {
1473 /* No restrictions */
1475 } else if (prop_info->form_flag == DATE_TIME_FORM) {
1476 mtp_wchar *date_time = pstring->str;
1477 if ((date_time[8] != L'T') && (pstring->num_chars > 9)) {
1478 ERR("invalid data time format");
1482 } else if (prop_info->form_flag == REGULAR_EXPRESSION_FORM) {
1489 mtp_bool _prop_set_default_string(prop_info_t *prop_info, mtp_wchar *val)
1491 if (prop_info->data_type == PTP_DATATYPE_STRING) {
1492 _prop_destroy_ptpstring(prop_info->default_val.str);
1493 #ifndef MTP_USE_VARIABLE_PTP_STRING_MALLOC
1494 prop_info->default_val.str = __alloc_ptpstring();
1495 #else /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
1496 prop_info->default_val.str = __alloc_ptpstring(_util_wchar_len(val));
1497 #endif /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
1498 if (NULL == prop_info->default_val.str)
1501 _prop_copy_char_to_ptpstring(prop_info->default_val.str,
1509 mtp_bool _prop_set_default_integer(prop_info_t *prop_info, mtp_uchar *value)
1511 if ((prop_info->data_type & PTP_DATATYPE_VALUEMASK) ==
1512 PTP_DATATYPE_VALUE) {
1513 memcpy(prop_info->default_val.integer, value,
1514 prop_info->dts_size);
1521 mtp_bool _prop_set_default_array(prop_info_t *prop_info, mtp_uchar *parray,
1524 /* Allocate memory for the PTP array */
1525 if ((prop_info->data_type == PTP_DATATYPE_AUINT8) ||
1526 (prop_info->data_type == PTP_DATATYPE_AINT8))
1527 prop_info->default_val.array = _prop_alloc_ptparray(UINT8_TYPE);
1528 else if ((prop_info->data_type == PTP_DATATYPE_AUINT16) ||
1529 (prop_info->data_type == PTP_DATATYPE_AINT16))
1530 prop_info->default_val.array = _prop_alloc_ptparray(UINT16_TYPE);
1531 else if ((prop_info->data_type == PTP_DATATYPE_AUINT32) ||
1532 (prop_info->data_type == PTP_DATATYPE_AINT32))
1533 prop_info->default_val.array = _prop_alloc_ptparray(UINT32_TYPE);
1537 if (prop_info->default_val.array == NULL)
1540 /* Copies the data into the PTP array */
1541 if ((prop_info->default_val.array != NULL) && (num_ele != 0)) {
1542 mtp_uchar *ptr8 = NULL;
1543 mtp_uint16 *ptr16 = NULL;
1544 mtp_uint32 *ptr32 = NULL;
1547 _prop_grow_ptparray(prop_info->default_val.array, num_ele);
1549 if ((prop_info->data_type == PTP_DATATYPE_AUINT8) ||
1550 (prop_info->data_type == PTP_DATATYPE_AINT8)) {
1551 ptr8 = (mtp_uchar *) parray;
1552 for (ii = 0; ii < num_ele; ii++)
1553 _prop_append_ele_ptparray(prop_info->default_val.array,
1556 } else if ((prop_info->data_type == PTP_DATATYPE_AUINT16) ||
1557 (prop_info->data_type == PTP_DATATYPE_AINT16)) {
1559 ptr16 = (mtp_uint16 *) parray;
1560 for (ii = 0; ii < num_ele; ii++)
1561 _prop_append_ele_ptparray(prop_info->default_val.array,
1564 } else if ((prop_info->data_type == PTP_DATATYPE_AUINT32) ||
1565 (prop_info->data_type == PTP_DATATYPE_AINT32)) {
1567 ptr32 = (mtp_uint32 *)parray;
1568 for (ii = 0; ii < num_ele; ii++)
1569 _prop_append_ele_ptparray(prop_info->default_val.array,
1577 mtp_bool _prop_set_current_integer(device_prop_desc_t *prop, mtp_uint32 val)
1579 if (_prop_is_valid_integer(&(prop->propinfo), val)) {
1583 ptr = (mtp_uchar *) &val;
1585 for (ii = 0; ii < sizeof(mtp_uint32); ii++)
1586 prop->current_val.integer[ii] = ptr[ii];
1590 /* setting invalid value */
1595 mtp_bool _prop_set_current_string(device_prop_desc_t *prop, ptp_string_t *str)
1597 if (_prop_is_valid_string(&(prop->propinfo), str)) {
1598 _prop_destroy_ptpstring(prop->current_val.str);
1599 #ifndef MTP_USE_VARIABLE_PTP_STRING_MALLOC
1600 prop->current_val.str = __alloc_ptpstring();
1601 #else /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
1602 prop->current_val.str = __alloc_ptpstring(str->num_chars);
1603 #endif /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
1604 if (prop->current_val.str != NULL) {
1605 _prop_copy_ptpstring(prop->current_val.str, str);
1608 _prop_destroy_ptpstring(prop->current_val.str);
1612 /* setting invalid value */
1617 mtp_bool _prop_set_current_array(device_prop_desc_t *prop, mtp_uchar *arr)
1619 mtp_uint32 num_ele = 0;
1620 mtp_uchar *pval = NULL;
1621 memcpy(&num_ele, arr, sizeof(mtp_uint32));
1622 pval = arr + sizeof(mtp_uint32);
1624 #ifdef __BIG_ENDIAN__
1625 /* Byte swap the number of elements */
1626 _util_conv_byte_order(&num_ele, sizeof(mtp_uint32));
1627 #endif /* __BIG_ENDIAN__ */
1629 /* Allocate memory for the PTP array */
1630 if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT8) ||
1631 (prop->propinfo.data_type == PTP_DATATYPE_AINT8)) {
1632 _prop_destroy_ptparray(prop->current_val.array);
1633 prop->current_val.array = _prop_alloc_ptparray(UINT8_TYPE);
1635 } else if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT16) ||
1636 (prop->propinfo.data_type == PTP_DATATYPE_AINT16)) {
1638 _prop_destroy_ptparray(prop->current_val.array);
1639 prop->current_val.array = _prop_alloc_ptparray(UINT16_TYPE);
1641 } else if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT32) ||
1642 (prop->propinfo.data_type == PTP_DATATYPE_AINT32)) {
1644 _prop_destroy_ptparray(prop->current_val.array);
1645 prop->current_val.array = _prop_alloc_ptparray(UINT32_TYPE);
1650 /* Copies the data into the PTP array */
1651 if ((prop->current_val.array != NULL) && (num_ele != 0)) {
1652 mtp_uchar *ptr8 = NULL;
1653 mtp_uint16 *ptr16 = NULL;
1654 mtp_uint32 *ptr32 = NULL;
1656 #ifdef __BIG_ENDIAN__
1657 /* Some temporary variables for swapping the bytes */
1660 #endif /* __BIG_ENDIAN__ */
1662 _prop_grow_ptparray(prop->current_val.array, num_ele);
1664 if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT8) ||
1665 (prop->propinfo.data_type == PTP_DATATYPE_AINT8)) {
1667 ptr8 = (mtp_uchar *) pval;
1668 for (ii = 0; ii < num_ele; ii++)
1669 _prop_append_ele_ptparray(prop->current_val.array,
1672 } else if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT16) ||
1673 (prop->propinfo.data_type == PTP_DATATYPE_AINT16)) {
1675 ptr16 = (mtp_uint16 *) pval;
1676 for (ii = 0; ii < num_ele; ii++) {
1677 #ifdef __BIG_ENDIAN__
1679 _util_conv_byte_order(&swap16, sizeof(mtp_uint16));
1680 _prop_append_ele_ptparray(prop->current_val.array,
1682 #else /* __BIG_ENDIAN__ */
1683 _prop_append_ele_ptparray(prop->current_val.array,
1685 #endif /* __BIG_ENDIAN__ */
1687 } else if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT32) ||
1688 (prop->propinfo.data_type == PTP_DATATYPE_AINT32)) {
1690 ptr32 = (mtp_uint32 *) pval;
1691 for (ii = 0; ii < num_ele; ii++) {
1692 #ifdef __BIG_ENDIAN__
1694 _util_conv_byte_order(&swap32, sizeof(mtp_uint32));
1695 _prop_append_ele_ptparray(prop->current_val.array,
1697 #else /* __BIG_ENDIAN__ */
1698 _prop_append_ele_ptparray(prop->current_val.array,
1700 #endif /* __BIG_ENDIAN__ */
1709 mtp_bool _prop_set_current_device_prop(device_prop_desc_t *prop, mtp_uchar *val,
1712 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
1714 _prop_init_ptpstring(&str);
1715 _prop_parse_rawstring(&str, val, size);
1716 return _prop_set_current_string(prop, &str);
1718 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
1719 PTP_DATATYPE_ARRAY) {
1721 mtp_uint32 *ptr = (mtp_uint32 *) val;
1722 if (size < sizeof(mtp_uint32))
1725 if (size < sizeof(mtp_uint32) + ptr[0] * prop->propinfo.dts_size)
1728 return _prop_set_current_array(prop, val);
1730 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
1731 PTP_DATATYPE_VALUE) {
1733 if (prop->propinfo.dts_size > size)
1736 if ((prop->propinfo.data_type == PTP_DATATYPE_INT64) ||
1737 (prop->propinfo.data_type == PTP_DATATYPE_UINT64) ||
1738 (prop->propinfo.data_type == PTP_DATATYPE_INT128) ||
1739 (prop->propinfo.data_type == PTP_DATATYPE_UINT128)) {
1741 /* No validation at this time */
1742 memcpy(prop->current_val.integer, val,
1743 prop->propinfo.dts_size);
1744 #ifdef __BIG_ENDIAN__
1745 _util_conv_byte_order(prop->current_val.integer,
1746 prop->propinfo.dts_size);
1747 #endif /* __BIG_ENDIAN__ */
1750 /* avoid using new_val = *(ddword*)val; */
1751 mtp_uint32 new_val = (mtp_uint32)0;
1752 memcpy(&new_val, val, size);
1753 #ifdef __BIG_ENDIAN__
1754 _util_conv_byte_order(&new_val, sizeof(mtp_uint32));
1755 #endif /* __BIG_ENDIAN__ */
1756 return _prop_set_current_integer(prop, new_val);
1763 mtp_bool _prop_set_current_integer_val(obj_prop_val_t *pval, mtp_uint64 val)
1765 if (_prop_is_valid_integer(&(pval->prop->propinfo), val)) {
1766 memset(pval->current_val.integer, 0,
1767 pval->prop->propinfo.dts_size * sizeof(mtp_byte));
1768 memcpy(pval->current_val.integer, &val,
1769 pval->prop->propinfo.dts_size * sizeof(mtp_byte));
1772 /* setting invalid value */
1777 mtp_bool _prop_set_current_string_val(obj_prop_val_t *pval, ptp_string_t *str)
1779 if (_prop_is_valid_string(&(pval->prop->propinfo), str)) {
1780 _prop_destroy_ptpstring(pval->current_val.str);
1781 #ifndef MTP_USE_VARIABLE_PTP_STRING_MALLOC
1782 pval->current_val.str = __alloc_ptpstring();
1783 #else /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
1784 pval->current_val.str = __alloc_ptpstring(str->num_chars);
1785 #endif /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
1786 if (pval->current_val.str != NULL) {
1787 _prop_copy_ptpstring(pval->current_val.str, str);
1792 /* setting invalid value */
1797 mtp_bool _prop_set_current_array_val(obj_prop_val_t *pval, mtp_uchar *arr,
1800 mtp_uint32 num_ele = 0;
1801 mtp_uchar *value = NULL;
1802 prop_info_t *propinfo = NULL;
1804 propinfo = &(pval->prop->propinfo);
1806 if (propinfo->data_type == PTP_DATATYPE_STRING) {
1808 _prop_init_ptpstring(&str);
1809 _prop_parse_rawstring(&str, arr, size);
1810 return _prop_set_current_string_val(pval, &str);
1812 } else if ((propinfo->data_type & PTP_DATATYPE_ARRAYMASK) ==
1813 PTP_DATATYPE_ARRAY) {
1815 if (size < sizeof(mtp_uint32))
1818 memcpy(&num_ele, arr, sizeof(mtp_uint32));
1819 DBG("parsed array num [%d]\n", num_ele);
1821 if (size < sizeof(mtp_uint32) +
1822 num_ele * (propinfo->dts_size)) {
1824 ERR("buffer size is not enough [%d]\n", size);
1828 value = arr + sizeof(mtp_uint32);
1830 if ((propinfo->data_type == PTP_DATATYPE_AUINT8) ||
1831 (propinfo->data_type == PTP_DATATYPE_AINT8)) {
1833 _prop_destroy_ptparray(pval->current_val.array);
1834 pval->current_val.array = _prop_alloc_ptparray(UINT8_TYPE);
1836 } else if ((propinfo->data_type == PTP_DATATYPE_AUINT16) ||
1837 (propinfo->data_type == PTP_DATATYPE_AINT16)) {
1839 _prop_destroy_ptparray(pval->current_val.array);
1840 pval->current_val.array = _prop_alloc_ptparray(UINT16_TYPE);
1842 } else if ((propinfo->data_type == PTP_DATATYPE_AUINT32) ||
1843 (propinfo->data_type == PTP_DATATYPE_AINT32)) {
1845 _prop_destroy_ptparray(pval->current_val.array);
1846 pval->current_val.array = _prop_alloc_ptparray(UINT32_TYPE);
1849 /* Copies the data into the PTP array */
1850 if ((pval->current_val.array != NULL) && (num_ele != 0)) {
1851 mtp_uchar *ptr8 = NULL;
1852 mtp_uint16 *ptr16 = NULL;
1853 mtp_uint32 *ptr32 = NULL;
1856 _prop_grow_ptparray(pval->current_val.array, num_ele);
1858 if ((propinfo->data_type == PTP_DATATYPE_AUINT8) ||
1859 (propinfo->data_type == PTP_DATATYPE_AINT8)) {
1861 ptr8 = (mtp_uchar *) value;
1862 for (ii = 0; ii < num_ele; ii++)
1863 _prop_append_ele_ptparray(pval->current_val.array,
1866 } else if ((propinfo->data_type == PTP_DATATYPE_AUINT16) ||
1867 (propinfo->data_type == PTP_DATATYPE_AINT16)) {
1868 ptr16 = (mtp_uint16 *) value;
1869 for (ii = 0; ii < num_ele; ii++)
1870 _prop_append_ele_ptparray(pval->current_val.array,
1873 } else if ((propinfo->data_type == PTP_DATATYPE_AUINT32) ||
1874 (propinfo->data_type == PTP_DATATYPE_AINT32)) {
1876 ptr32 = (mtp_uint32 *)value;
1877 for (ii = 0; ii < num_ele; ii++)
1878 _prop_append_ele_ptparray(pval->current_val.array,
1883 } else if ((propinfo->data_type & PTP_DATATYPE_VALUEMASK) ==
1884 PTP_DATATYPE_VALUE) {
1886 if (propinfo->dts_size > size)
1889 if ((propinfo->data_type == PTP_DATATYPE_INT64) ||
1890 (propinfo->data_type == PTP_DATATYPE_UINT64) ||
1891 (propinfo->data_type == PTP_DATATYPE_INT128) ||
1892 (propinfo->data_type == PTP_DATATYPE_UINT128)) {
1894 if (propinfo->data_type == PTP_DATATYPE_UINT64) {
1895 memcpy(pval->current_val.integer, arr,
1896 propinfo->dts_size);
1898 memcpy(pval->current_val.integer, arr,
1899 propinfo->dts_size);
1903 mtp_uint32 new_val = 0;
1904 memcpy(&new_val, arr, propinfo->dts_size);
1905 return _prop_set_current_integer_val(pval,
1912 #ifdef __BIG_ENDIAN__
1913 mtp_bool _prop_set_current_array_val_usbrawdata(obj_prop_val_t *pval,
1914 mtp_uchar *arr, mtp_uint32 size)
1916 mtp_uint32 num_ele = 0;
1917 mtp_uchar *value = NULL;
1918 prop_info_t *propinfo = NULL;
1920 propinfo = &(pval->prop->propinfo);
1922 if (propinfo->data_type == PTP_DATATYPE_STRING) {
1924 _prop_init_ptpstring(&str);
1925 _prop_parse_rawstring(&str, arr, size);
1926 return _prop_set_current_string_val(pval, &str);
1928 } else if ((propinfo->data_type & PTP_DATATYPE_ARRAYMASK) ==
1929 PTP_DATATYPE_ARRAY) {
1931 if (size < sizeof(mtp_uint32))
1934 memcpy(&num_ele, arr, sizeof(mtp_uint32));
1935 #ifdef __BIG_ENDIAN__
1936 _util_conv_byte_order(&num_ele, sizeof(mtp_uint32));
1937 #endif /* __BIG_ENDIAN__ */
1938 if (size < sizeof(mtp_uint32) + num_ele * propinfo->dts_size)
1941 value = arr + sizeof(mtp_uint32);
1943 if ((propinfo->data_type == PTP_DATATYPE_AUINT8) ||
1944 (propinfo->data_type == PTP_DATATYPE_AINT8)) {
1946 _prop_destroy_ptparray(pval->current_val.array);
1947 pval->current_val.array = _prop_alloc_ptparray(UINT8_TYPE);
1949 } else if ((propinfo->data_type == PTP_DATATYPE_AUINT16) ||
1950 (propinfo->data_type == PTP_DATATYPE_AINT16)) {
1952 _prop_destroy_ptparray(pval->current_val.array);
1953 pval->current_val.array = _prop_alloc_ptparray(UINT16_TYPE);
1955 } else if ((propinfo->data_type == PTP_DATATYPE_AUINT32) ||
1956 (propinfo->data_type == PTP_DATATYPE_AINT32)) {
1958 _prop_destroy_ptparray(pval->current_val.array);
1959 pval->current_val.array = _prop_alloc_ptparray(UINT32_TYPE);
1963 /* Copies the data into the PTP array */
1964 if ((pval->current_val.array != NULL) && (num_ele != 0)) {
1966 mtp_uchar *ptr8 = NULL;
1967 mtp_uint16 *ptr16 = NULL;
1968 mtp_uint32 *ptr32 = NULL;
1971 _prop_grow_ptparray(pval->current_val.array, num_ele);
1973 if ((propinfo->data_type == PTP_DATATYPE_AUINT8) ||
1974 (propinfo->data_type == PTP_DATATYPE_AINT8)) {
1976 ptr8 = (mtp_uchar *) arr;
1977 for (ii = 0; ii < num_ele; ii++)
1978 _prop_append_ele_ptparray(pval->current_val.array,
1981 } else if ((propinfo->data_type == PTP_DATATYPE_AUINT16) ||
1982 (propinfo->data_type ==
1983 PTP_DATATYPE_AINT16)) {
1985 ptr16 = (mtp_uint16 *) arr;
1986 #ifdef __BIG_ENDIAN__
1987 _util_conv_byte_order_gen_str(ptr16,
1988 num_ele, sizeof(mtp_uint16));
1989 #endif /* __BIG_ENDIAN__ */
1990 for (ii = 0; ii < num_ele; ii++)
1991 _prop_append_ele_ptparray(pval->current_val.array,
1994 } else if ((propinfo->data_type == PTP_DATATYPE_AUINT32) ||
1995 (propinfo->data_type ==
1996 PTP_DATATYPE_AINT32)) {
1998 ptr32 = (mtp_uint32 *) arr;
1999 #ifdef __BIG_ENDIAN__
2000 _util_conv_byte_order_gen_str(ptr32, num_ele,
2001 sizeof(mtp_uint32));
2002 #endif /* __BIG_ENDIAN__ */
2003 for (ii = 0; ii < num_ele; ii++)
2004 _prop_append_ele_ptparray(pval->current_val.array,
2009 } else if ((propinfo->data_type & PTP_DATATYPE_VALUEMASK) ==
2010 PTP_DATATYPE_VALUE) {
2012 if (propinfo->dts_size > size)
2015 if ((propinfo->data_type == PTP_DATATYPE_INT64) ||
2016 (propinfo->data_type == PTP_DATATYPE_UINT64) ||
2017 (propinfo->data_type == PTP_DATATYPE_INT128) ||
2018 (propinfo->data_type == PTP_DATATYPE_UINT128)) {
2020 memcpy(pval->current_val.integer, arr,
2021 propinfo->dts_size);
2022 #ifdef __BIG_ENDIAN__
2023 _util_conv_byte_order(pval->current_val.integer,
2024 propinfo->dts_size);
2025 #endif /* __BIG_ENDIAN__ */
2028 mtp_uint32 new_val = 0;
2029 memcpy(&new_val, arr, propinfo->dts_size);
2030 return _prop_set_current_integer_val(pval, new_val);
2035 #endif /* __BIG_ENDIAN__ */
2037 mtp_bool _prop_set_range_integer(prop_info_t *prop_info, mtp_uint32 min,
2038 mtp_uint32 max, mtp_uint32 step)
2040 if (((prop_info->data_type & PTP_DATATYPE_VALUEMASK) !=
2041 PTP_DATATYPE_VALUE) || (prop_info->form_flag != RANGE_FORM)) {
2045 prop_info->range.min_val = min;
2046 prop_info->range.max_val = max;
2047 prop_info->range.step_size = step;
2052 mtp_bool _prop_set_regexp(obj_prop_desc_t *prop, mtp_wchar *regex)
2056 if ((prop->propinfo.data_type != PTP_DATATYPE_STRING) ||
2057 (prop->propinfo.form_flag != REGULAR_EXPRESSION_FORM)) {
2060 #ifndef MTP_USE_VARIABLE_PTP_STRING_MALLOC
2061 str = __alloc_ptpstring();
2062 #else /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
2063 str = __alloc_ptpstring(_util_wchar_len(regex));
2064 #endif /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
2068 _prop_copy_char_to_ptpstring(str, regex, WCHAR_TYPE);
2069 prop->prop_forms.reg_exp = str;
2074 mtp_bool _prop_set_maxlen(obj_prop_desc_t *prop, mtp_uint32 max)
2076 if ((prop->propinfo.form_flag != BYTE_ARRAY_FORM) &&
2077 (prop->propinfo.form_flag != LONG_STRING_FORM)) {
2081 if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) !=
2082 PTP_DATATYPE_ARRAY) {
2086 prop->prop_forms.max_len = max;
2091 /* DeviceObjectPropDesc Functions */
2092 void _prop_init_device_property_desc(device_prop_desc_t *prop,
2093 mtp_uint16 propcode, mtp_uint16 data_type, mtp_uchar get_set,
2094 mtp_uchar form_flag)
2098 prop->propinfo.prop_code = propcode;
2099 prop->propinfo.data_type = data_type;
2100 prop->propinfo.get_set = get_set;
2101 prop->propinfo.default_val.str = NULL;
2102 prop->current_val.str = NULL;
2103 prop->propinfo.form_flag = form_flag;
2105 for (ii = 0; ii < 16; ii++) {
2106 prop->current_val.integer[ii] = 0;
2107 prop->propinfo.default_val.integer[ii] = 0;
2110 /* size of default value: DTS */
2111 switch (prop->propinfo.data_type) {
2112 case PTP_DATATYPE_UINT8:
2113 case PTP_DATATYPE_INT8:
2114 case PTP_DATATYPE_AINT8:
2115 case PTP_DATATYPE_AUINT8:
2116 prop->propinfo.dts_size = sizeof(mtp_uchar);
2119 case PTP_DATATYPE_UINT16:
2120 case PTP_DATATYPE_INT16:
2121 case PTP_DATATYPE_AINT16:
2122 case PTP_DATATYPE_AUINT16:
2123 prop->propinfo.dts_size = sizeof(mtp_uint16);
2126 case PTP_DATATYPE_UINT32:
2127 case PTP_DATATYPE_INT32:
2128 case PTP_DATATYPE_AINT32:
2129 case PTP_DATATYPE_AUINT32:
2130 prop->propinfo.dts_size = sizeof(mtp_uint32);
2133 case PTP_DATATYPE_UINT64:
2134 case PTP_DATATYPE_INT64:
2135 case PTP_DATATYPE_AINT64:
2136 case PTP_DATATYPE_AUINT64:
2137 prop->propinfo.dts_size = sizeof(mtp_int64);
2140 case PTP_DATATYPE_UINT128:
2141 case PTP_DATATYPE_INT128:
2142 case PTP_DATATYPE_AINT128:
2143 case PTP_DATATYPE_AUINT128:
2144 prop->propinfo.dts_size = 2 * sizeof(mtp_int64);
2147 case PTP_DATATYPE_STRING:
2149 /* don't know how to handle at this point (including PTP_DATATYPE_STRING) */
2150 prop->propinfo.dts_size = 0;
2154 _util_init_list(&(prop->propinfo.supp_value_list));
2159 mtp_uint32 _prop_size_device_prop_desc(device_prop_desc_t *prop)
2161 /* size :PropCode,Datatype,Getset,formflag */
2162 mtp_uint32 size = sizeof(mtp_uint16) + sizeof(mtp_uint16) +
2163 sizeof(mtp_uchar) + sizeof(mtp_uchar);
2165 /* size of default value: DTS */
2166 /* size of current value: DTS */
2167 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2169 size += _prop_size_ptpstring(prop->propinfo.default_val.str);
2170 size += _prop_size_ptpstring(prop->current_val.str);
2173 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2174 PTP_DATATYPE_ARRAY) {
2176 size += _prop_get_size_ptparray(prop->propinfo.default_val.array);
2177 size += _prop_get_size_ptparray(prop->current_val.array);
2180 size += 2 * prop->propinfo.dts_size;
2183 /* Add the size of the Form followed */
2184 switch (prop->propinfo.form_flag) {
2189 size += 3 * prop->propinfo.dts_size;
2193 /* Number of Values */
2194 size += sizeof(mtp_uint16);
2195 if (prop->propinfo.data_type != PTP_DATATYPE_STRING) {
2197 size += prop->propinfo.supp_value_list.nnodes *
2198 prop->propinfo.dts_size;
2201 slist_node_t *node = NULL;
2204 for (ii = 0, node = prop->propinfo.supp_value_list.start;
2205 ii < prop->propinfo.supp_value_list.nnodes;
2206 ii++, node = node->link) {
2208 size += _prop_size_ptpstring((ptp_string_t *) node->value);
2214 /* don't know how to handle */
2222 static mtp_uint32 __size_curval_device_prop(device_prop_desc_t *prop)
2224 mtp_uint32 size = 0;
2226 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2228 size = _prop_size_ptpstring(prop->current_val.str);
2230 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2231 PTP_DATATYPE_ARRAY) {
2233 size = _prop_get_size_ptparray(prop->current_val.array);
2235 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2236 PTP_DATATYPE_VALUE) {
2238 size = prop->propinfo.dts_size;
2243 mtp_uint32 _prop_pack_device_prop_desc(device_prop_desc_t *prop,
2244 mtp_uchar *buf, mtp_uint32 size)
2246 mtp_uchar *temp = buf;
2247 mtp_uint32 count = 0;
2248 mtp_uint32 bytes_to_write = 0;
2249 slist_node_t *node = NULL;
2252 if (!buf || size < _prop_size_device_prop_desc(prop))
2255 /* Pack propcode, data_type, & get_set */
2256 bytes_to_write = sizeof(mtp_uint16);
2257 memcpy(temp, &(prop->propinfo.prop_code), bytes_to_write);
2258 #ifdef __BIG_ENDIAN__
2259 _util_conv_byte_order(temp, bytes_to_write);
2260 #endif /* __BIG_ENDIAN__ */
2261 temp += bytes_to_write;
2263 bytes_to_write = sizeof(mtp_uint16);
2264 memcpy(temp, &(prop->propinfo.data_type), bytes_to_write);
2265 #ifdef __BIG_ENDIAN__
2266 _util_conv_byte_order(temp, bytes_to_write);
2267 #endif /* __BIG_ENDIAN__ */
2268 temp += bytes_to_write;
2270 bytes_to_write = sizeof(mtp_uchar);
2271 memcpy(temp, &(prop->propinfo.get_set), bytes_to_write);
2272 #ifdef __BIG_ENDIAN__
2273 _util_conv_byte_order(temp, bytes_to_write);
2274 #endif /* __BIG_ENDIAN__ */
2275 temp += bytes_to_write;
2277 /* Pack Default/Current Value: DTS */
2278 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2280 bytes_to_write = _prop_size_ptpstring(prop->propinfo.default_val.str);
2281 if (bytes_to_write !=
2282 _prop_pack_ptpstring(prop->propinfo.default_val.str,
2283 temp, bytes_to_write)) {
2285 return (mtp_uint32)(temp - buf);
2287 temp += bytes_to_write;
2289 bytes_to_write = _prop_size_ptpstring(prop->current_val.str);
2290 if (bytes_to_write !=
2291 _prop_pack_ptpstring(prop->current_val.str,
2292 temp, bytes_to_write)) {
2294 return (mtp_uint32)(temp - buf);
2296 temp += bytes_to_write;
2298 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2299 PTP_DATATYPE_ARRAY) {
2301 bytes_to_write = _prop_get_size_ptparray(prop->propinfo.default_val.array);
2302 if (bytes_to_write !=
2303 _prop_pack_ptparray(prop->propinfo.default_val.array,
2304 temp, bytes_to_write)) {
2306 return (mtp_uint32)(temp - buf);
2308 temp += bytes_to_write;
2310 bytes_to_write = _prop_get_size_ptparray(prop->current_val.array);
2311 if (bytes_to_write !=
2312 _prop_pack_ptparray(prop->current_val.array,
2313 temp, bytes_to_write)) {
2315 return (mtp_uint32)(temp - buf);
2317 temp += bytes_to_write;
2319 /* Add support for other array data types */
2320 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2321 PTP_DATATYPE_VALUE) {
2323 bytes_to_write = prop->propinfo.dts_size;
2324 memcpy(temp, prop->propinfo.default_val.integer, bytes_to_write);
2325 #ifdef __BIG_ENDIAN__
2326 _util_conv_byte_order(temp, bytes_to_write);
2327 #endif /* __BIG_ENDIAN__ */
2328 temp += bytes_to_write;
2330 memcpy(temp, prop->current_val.integer, bytes_to_write);
2331 #ifdef __BIG_ENDIAN__
2332 _util_conv_byte_order(temp, bytes_to_write);
2333 #endif /* __BIG_ENDIAN__ */
2334 temp += bytes_to_write;
2338 /* Now pack the FormFlag */
2339 memcpy(temp, &(prop->propinfo.form_flag), sizeof(mtp_uchar));
2340 temp += sizeof(mtp_uchar);
2342 /* Finally pack the Form followed */
2343 switch (prop->propinfo.form_flag) {
2348 /* Min, Max, & Step */
2349 memcpy(temp, &(prop->propinfo.range.min_val),
2350 prop->propinfo.dts_size);
2351 temp += prop->propinfo.dts_size;
2352 memcpy(temp, &(prop->propinfo.range.max_val),
2353 prop->propinfo.dts_size);
2354 temp += prop->propinfo.dts_size;
2355 memcpy(temp, &(prop->propinfo.range.step_size),
2356 prop->propinfo.dts_size);
2357 temp += prop->propinfo.dts_size;
2362 /* Pack Number of Values in this enumeration */
2363 count = prop->propinfo.supp_value_list.nnodes;
2365 memcpy(temp, &count, sizeof(mtp_uint16));
2366 #ifdef __BIG_ENDIAN__
2367 _util_conv_byte_order(temp, sizeof(mtp_uint16));
2368 #endif /* __BIG_ENDIAN__ */
2369 temp += sizeof(mtp_uint16);
2371 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2373 for (ii = 0, node = prop->propinfo.supp_value_list.start;
2374 ii < prop->propinfo.supp_value_list.nnodes;
2375 ii++, node = node->link) {
2378 _prop_size_ptpstring((ptp_string_t *) node->value);
2379 if (bytes_to_write !=
2380 _prop_pack_ptpstring((ptp_string_t *) node->value,
2381 temp, bytes_to_write)) {
2383 return (mtp_uint32)(temp - buf);
2385 temp += bytes_to_write;
2389 mtp_uint32 value = 0;
2391 for (ii = 0, node = prop->propinfo.supp_value_list.start;
2392 ii < prop->propinfo.supp_value_list.nnodes;
2393 ii++, node = node->link) {
2395 value = (mtp_uint32)node->value;
2396 memcpy(temp, &value, prop->propinfo.dts_size);
2397 #ifdef __BIG_ENDIAN__
2398 _util_conv_byte_order(temp, prop->propinfo.dts_size);
2399 #endif /* __BIG_ENDIAN__ */
2400 temp += prop->propinfo.dts_size;
2406 /*don't know how to handle */
2411 return (mtp_uint32)(temp - buf);
2414 mtp_uint32 _prop_pack_curval_device_prop_desc(device_prop_desc_t *prop,
2415 mtp_uchar *buf, mtp_uint32 size)
2417 mtp_uint32 bytes_to_write;
2419 bytes_to_write = __size_curval_device_prop(prop);
2421 if ((!bytes_to_write) || (buf == NULL) || (size < bytes_to_write))
2424 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2425 if (bytes_to_write != _prop_pack_ptpstring(prop->current_val.str,
2426 buf, bytes_to_write)) {
2429 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2430 PTP_DATATYPE_ARRAY) {
2432 if (bytes_to_write != _prop_pack_ptparray(prop->current_val.array,
2433 buf, bytes_to_write)) {
2436 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2437 PTP_DATATYPE_VALUE) {
2438 /* this property is of type UINT8, ... */
2439 memcpy(buf, prop->current_val.integer, bytes_to_write);
2440 #ifdef __BIG_ENDIAN__
2441 _util_conv_byte_order(buf, bytes_to_write);
2442 #endif /* __BIG_ENDIAN__ */
2447 return bytes_to_write;
2450 void _prop_reset_device_prop_desc(device_prop_desc_t *prop)
2452 ret_if(prop == NULL);
2454 if (prop->propinfo.get_set == PTP_PROPGETSET_GETONLY)
2457 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2459 _prop_destroy_ptpstring(prop->current_val.str);
2460 #ifndef MTP_USE_VARIABLE_PTP_STRING_MALLOC
2461 prop->current_val.str = __alloc_ptpstring();
2462 #else /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
2463 prop->current_val.str = __alloc_ptpstring(prop->propinfo.default_val.str->num_chars);
2464 #endif /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
2465 if (NULL == prop->current_val.str)
2468 _prop_copy_ptpstring(prop->current_val.str,
2469 prop->propinfo.default_val.str);
2471 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2472 PTP_DATATYPE_ARRAY) {
2474 _prop_destroy_ptparray(prop->current_val.array);
2475 prop->current_val.array = _prop_alloc_ptparray(UINT32_TYPE);
2476 if (NULL == prop->current_val.array)
2479 _prop_copy_ptparray(prop->current_val.array,
2480 prop->propinfo.default_val.array);
2482 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2483 PTP_DATATYPE_VALUE) {
2486 for (ii = 0; ii < 16; ii++)
2487 prop->current_val.integer[ii] =
2488 prop->propinfo.default_val.integer[ii];
2492 /* ObjectPropVal Functions */
2493 obj_prop_val_t * _prop_alloc_obj_propval(obj_prop_desc_t *prop)
2495 obj_prop_val_t *pval = NULL;
2496 pval = (obj_prop_val_t *)g_malloc(sizeof(obj_prop_val_t));
2499 __init_obj_propval(pval, prop);
2504 static void __init_obj_propval(obj_prop_val_t *pval, obj_prop_desc_t *prop)
2510 for (ii = 0; ii < 16; ii++)
2511 pval->current_val.integer[ii] = 0;
2513 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2515 #ifndef MTP_USE_VARIABLE_PTP_STRING_MALLOC
2516 pval->current_val.str = __alloc_ptpstring();
2517 #else /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
2518 pval->current_val.str = __alloc_ptpstring(prop->propinfo.default_val.str->num_chars);
2519 #endif /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
2520 if (NULL == pval->current_val.str)
2522 _prop_copy_ptpstring(pval->current_val.str,
2523 prop->propinfo.default_val.str);
2524 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2525 PTP_DATATYPE_VALUE) {
2527 memcpy(pval->current_val.integer,
2528 prop->propinfo.default_val.integer,
2529 prop->propinfo.dts_size);
2531 if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT8) ||
2532 (prop->propinfo.data_type == PTP_DATATYPE_AINT8)) {
2534 pval->current_val.array = _prop_alloc_ptparray(UINT8_TYPE);
2535 if (NULL == pval->current_val.array)
2538 _prop_copy_ptparray(pval->current_val.array,
2539 prop->propinfo.default_val.array);
2541 } else if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT16) ||
2542 (prop->propinfo.data_type == PTP_DATATYPE_AINT16)) {
2544 pval->current_val.array = _prop_alloc_ptparray(UINT16_TYPE);
2545 if (NULL == pval->current_val.array)
2548 _prop_copy_ptparray(pval->current_val.array,
2549 prop->propinfo.default_val.array);
2551 } else if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT32) ||
2552 (prop->propinfo.data_type == PTP_DATATYPE_AINT32)) {
2554 pval->current_val.array = _prop_alloc_ptparray(UINT32_TYPE);
2555 if (NULL == pval->current_val.array)
2558 _prop_copy_ptparray(pval->current_val.array,
2559 prop->propinfo.default_val.array);
2562 /* Add support for other array data types */
2567 obj_prop_val_t *_prop_get_prop_val(mtp_obj_t *obj, mtp_uint32 propcode)
2569 obj_prop_val_t *prop_val = NULL;
2570 slist_node_t *node = NULL;
2573 /*Update the properties if count is zero*/
2574 if (obj->propval_list.nnodes == 0)
2575 _prop_update_property_values_list(obj);
2577 for (ii = 0, node = obj->propval_list.start;
2578 ii < obj->propval_list.nnodes; ii++, node = node->link) {
2579 if (node == NULL || node->value == NULL)
2582 prop_val = (obj_prop_val_t *)node->value;
2584 if (prop_val->prop->propinfo.prop_code == propcode)
2592 /* update property and try again */
2593 _prop_update_property_values_list(obj);
2595 for (ii = 0, node = obj->propval_list.start;
2596 ii < obj->propval_list.nnodes;
2597 ii++, node = node->link) {
2598 if (node == NULL || node->value == NULL)
2601 prop_val = (obj_prop_val_t *)node->value;
2602 if ((prop_val) && (prop_val->prop->propinfo.prop_code ==
2607 ERR("node or node->value is null. try again but not found");
2611 mtp_uint32 _prop_pack_obj_propval(obj_prop_val_t *pval, mtp_uchar *buf,
2614 mtp_uint32 bytes_to_write = _prop_size_obj_propval(pval);
2616 if ((!bytes_to_write) || (buf == NULL) || (size < bytes_to_write))
2619 if (pval->prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2621 if (bytes_to_write != _prop_pack_ptpstring(pval->current_val.str,
2622 buf, bytes_to_write)) {
2625 } else if ((pval->prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2626 PTP_DATATYPE_ARRAY) {
2628 if (bytes_to_write != _prop_pack_ptparray(pval->current_val.array,
2633 } else if ((pval->prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2634 PTP_DATATYPE_VALUE) {
2636 /* this property is of type UINT8, ... */
2637 memcpy(buf, pval->current_val.integer, bytes_to_write);
2638 #ifdef __BIG_ENDIAN__
2639 _util_conv_byte_order(buf, bytes_to_write);
2640 #endif /* __BIG_ENDIAN__ */
2645 return bytes_to_write;
2649 mtp_uint32 _prop_size_obj_propval(obj_prop_val_t *pval)
2651 mtp_uint32 size = 0;
2653 if (pval == NULL || pval->prop == NULL)
2656 if (pval->prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2657 if (pval->current_val.str == NULL)
2660 size = _prop_size_ptpstring(pval->current_val.str);
2662 } else if ((pval->prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2663 PTP_DATATYPE_ARRAY) {
2664 size = _prop_get_size_ptparray(pval->current_val.array);
2666 } else if ((pval->prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2667 PTP_DATATYPE_VALUE) {
2668 size = pval->prop->propinfo.dts_size;
2674 void _prop_destroy_obj_propval(obj_prop_val_t *pval)
2679 if (pval->prop == NULL) {
2685 if (pval->prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2686 if (pval->current_val.str) {
2687 _prop_destroy_ptpstring(pval->current_val.str);
2688 pval->current_val.str = NULL;
2690 } else if ((pval->prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2691 PTP_DATATYPE_ARRAY) {
2692 _prop_destroy_ptparray(pval->current_val.array);
2693 pval->current_val.array = NULL;
2704 static void __init_obj_prop_desc(obj_prop_desc_t *prop, mtp_uint16 propcode,
2705 mtp_uint16 data_type, mtp_uchar get_set, mtp_uchar form_flag,
2706 mtp_uint32 group_code)
2709 prop->propinfo.prop_code = propcode;/*Property code for this property*/
2710 prop->propinfo.data_type = data_type; /* 2=byte, 4=word,
2711 * 6=dword, 0xFFFF=String)
2713 prop->propinfo.get_set = get_set; /* 0=get-only, 1=get-set */
2714 prop->propinfo.default_val.str = NULL; /* Default value for a String value type */
2716 prop->propinfo.form_flag = form_flag;
2718 if (prop->propinfo.form_flag == BYTE_ARRAY_FORM)
2719 prop->propinfo.data_type = PTP_DATATYPE_AUINT8;
2720 else if (prop->propinfo.form_flag == LONG_STRING_FORM)
2721 prop->propinfo.data_type = PTP_DATATYPE_AUINT16;
2723 prop->group_code = group_code;
2725 /* Zero out the integer byte array */
2726 for (ii = 0; ii < 16; ii++)
2727 prop->propinfo.default_val.integer[ii] = 0;
2729 /* size of default value: DTS */
2730 switch (prop->propinfo.data_type) {
2732 case PTP_DATATYPE_UINT8:
2733 case PTP_DATATYPE_INT8:
2734 case PTP_DATATYPE_AINT8:
2735 case PTP_DATATYPE_AUINT8:
2736 prop->propinfo.dts_size = sizeof(mtp_uchar);
2739 case PTP_DATATYPE_UINT16:
2740 case PTP_DATATYPE_INT16:
2741 case PTP_DATATYPE_AINT16:
2742 case PTP_DATATYPE_AUINT16:
2743 prop->propinfo.dts_size = sizeof(mtp_uint16);
2746 case PTP_DATATYPE_UINT32:
2747 case PTP_DATATYPE_INT32:
2748 case PTP_DATATYPE_AINT32:
2749 case PTP_DATATYPE_AUINT32:
2750 prop->propinfo.dts_size = sizeof(mtp_uint32);
2753 case PTP_DATATYPE_UINT64:
2754 case PTP_DATATYPE_INT64:
2755 case PTP_DATATYPE_AINT64:
2756 case PTP_DATATYPE_AUINT64:
2757 prop->propinfo.dts_size = sizeof(mtp_int64);
2760 case PTP_DATATYPE_UINT128:
2761 case PTP_DATATYPE_INT128:
2762 case PTP_DATATYPE_AINT128:
2763 case PTP_DATATYPE_AUINT128:
2764 prop->propinfo.dts_size = 2 * sizeof(mtp_int64);
2767 case PTP_DATATYPE_STRING:
2769 prop->propinfo.dts_size = 0;
2773 _util_init_list(&(prop->propinfo.supp_value_list));
2775 prop->prop_forms.reg_exp = NULL;
2776 prop->prop_forms.max_len = 0;
2781 static mtp_uint32 __get_size_default_val_obj_prop_desc(obj_prop_desc_t *prop)
2783 mtp_uint32 size = 0;
2785 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2787 size = _prop_size_ptpstring(prop->propinfo.default_val.str);
2789 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2790 PTP_DATATYPE_ARRAY) {
2792 size = _prop_get_size_ptparray(prop->propinfo.default_val.array);
2794 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2795 PTP_DATATYPE_VALUE) {
2797 size = prop->propinfo.dts_size;
2803 mtp_uint32 _prop_size_obj_prop_desc(obj_prop_desc_t *prop)
2806 sizeof(mtp_uint16) + sizeof(mtp_uint16) + sizeof(mtp_uchar) +
2807 sizeof(mtp_uint32) + sizeof(mtp_uchar);
2809 /* size of default value: DTS */
2810 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2812 size += _prop_size_ptpstring(prop->propinfo.default_val.str);
2814 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2815 PTP_DATATYPE_ARRAY) {
2817 size += _prop_get_size_ptparray(prop->propinfo.default_val.array);
2819 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2820 PTP_DATATYPE_VALUE) {
2822 size += prop->propinfo.dts_size;
2825 /* Add the size of the Form followed */
2826 switch (prop->propinfo.form_flag) {
2831 if (prop->propinfo.data_type != PTP_DATATYPE_STRING)
2832 size += 3 * prop->propinfo.dts_size;/* Min,Max,Step */
2837 /* Number of Values */
2838 size += sizeof(mtp_uint16);
2839 if (prop->propinfo.data_type != PTP_DATATYPE_STRING) {
2840 size += prop->propinfo.supp_value_list.nnodes *
2841 prop->propinfo.dts_size;
2843 slist_node_t *node = NULL;
2846 for (ii = 0, node = prop->propinfo.supp_value_list.start;
2847 ii < prop->propinfo.supp_value_list.nnodes;
2848 ii++, node = node->link) {
2850 size += _prop_size_ptpstring((ptp_string_t *) node->value);
2855 case DATE_TIME_FORM:
2858 case REGULAR_EXPRESSION_FORM:
2859 size += _prop_size_ptpstring(prop->prop_forms.reg_exp);
2862 case BYTE_ARRAY_FORM:
2863 case LONG_STRING_FORM:
2864 size += sizeof(prop->prop_forms.max_len);
2868 /*don't know how to handle */
2876 mtp_uint32 _prop_pack_obj_prop_desc(obj_prop_desc_t *prop, mtp_uchar *buf,
2879 mtp_uchar *temp = buf;
2880 mtp_uint32 count = 0;
2881 mtp_uint32 bytes_to_write = 0;
2882 slist_node_t *node = NULL;
2885 if (!buf || size < _prop_size_obj_prop_desc(prop))
2888 /* Pack propcode, data_type, & get_set */
2889 bytes_to_write = sizeof(mtp_uint16);
2890 memcpy(temp, &(prop->propinfo.prop_code), bytes_to_write);
2891 #ifdef __BIG_ENDIAN__
2892 _util_conv_byte_order(temp, bytes_to_write);
2893 #endif /* __BIG_ENDIAN__ */
2894 temp += bytes_to_write;
2896 bytes_to_write = sizeof(mtp_uint16);
2897 memcpy(temp, &(prop->propinfo.data_type), bytes_to_write);
2898 #ifdef __BIG_ENDIAN__
2899 _util_conv_byte_order(temp, bytes_to_write);
2900 #endif /* __BIG_ENDIAN__ */
2901 temp += bytes_to_write;
2903 bytes_to_write = sizeof(mtp_uchar);
2904 memcpy(temp, &(prop->propinfo.get_set), bytes_to_write);
2905 #ifdef __BIG_ENDIAN__
2906 _util_conv_byte_order(temp, bytes_to_write);
2907 #endif /* __BIG_ENDIAN__ */
2908 temp += bytes_to_write;
2910 /* Pack Default Value: DTS */
2911 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2914 _prop_size_ptpstring(prop->propinfo.default_val.str);
2915 if (bytes_to_write != _prop_pack_ptpstring(prop->propinfo.default_val.str,
2916 temp, bytes_to_write)) {
2917 return (mtp_uint32)(temp - buf);
2919 temp += bytes_to_write;
2921 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2922 PTP_DATATYPE_ARRAY) {
2924 bytes_to_write = _prop_get_size_ptparray(prop->propinfo.default_val.array);
2925 if (bytes_to_write != _prop_pack_ptparray(prop->propinfo.default_val.array,
2926 temp, bytes_to_write)) {
2927 return (mtp_uint32)(temp - buf);
2929 temp += bytes_to_write;
2931 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2932 PTP_DATATYPE_VALUE) {
2934 bytes_to_write = prop->propinfo.dts_size;
2935 memcpy(temp, prop->propinfo.default_val.integer, bytes_to_write);
2936 #ifdef __BIG_ENDIAN__
2937 _util_conv_byte_order(temp, bytes_to_write);
2938 #endif /* __BIG_ENDIAN__ */
2939 temp += bytes_to_write;
2942 /* Pack group_code */
2943 memcpy(temp, &(prop->group_code), sizeof(mtp_uint32));
2944 #ifdef __BIG_ENDIAN__
2945 _util_conv_byte_order(temp, sizeof(mtp_uint32));
2946 #endif /* __BIG_ENDIAN__ */
2947 temp += sizeof(mtp_uint32);
2949 /* Pack the FormFlag */
2950 memcpy(temp, &(prop->propinfo.form_flag), sizeof(mtp_uchar));
2951 #ifdef __BIG_ENDIAN__
2952 _util_conv_byte_order(temp, sizeof(mtp_uchar));
2953 #endif /* __BIG_ENDIAN__ */
2954 temp += sizeof(mtp_uchar);
2956 /* Pack the Form Flag values */
2957 switch (prop->propinfo.form_flag) {
2962 /* Min, Max, & Step */
2963 memcpy(temp, &(prop->propinfo.range.min_val),
2964 prop->propinfo.dts_size);
2965 #ifdef __BIG_ENDIAN__
2966 _util_conv_byte_order(temp, prop->propinfo.dts_size);
2967 #endif /* __BIG_ENDIAN__ */
2968 temp += prop->propinfo.dts_size;
2969 memcpy(temp, &(prop->propinfo.range.max_val),
2970 prop->propinfo.dts_size);
2971 #ifdef __BIG_ENDIAN__
2972 _util_conv_byte_order(temp, prop->propinfo.dts_size);
2973 #endif /* __BIG_ENDIAN__ */
2974 temp += prop->propinfo.dts_size;
2975 memcpy(temp, &(prop->propinfo.range.step_size),
2976 prop->propinfo.dts_size);
2977 #ifdef __BIG_ENDIAN__
2978 _util_conv_byte_order(temp, prop->propinfo.dts_size);
2979 #endif /* __BIG_ENDIAN__ */
2980 temp += prop->propinfo.dts_size;
2985 /* Pack Number of Values in this enumeration */
2986 count = prop->propinfo.supp_value_list.nnodes;
2988 memcpy(temp, &count, sizeof(mtp_uint16));
2989 #ifdef __BIG_ENDIAN__
2990 _util_conv_byte_order(temp, sizeof(mtp_uint16));
2991 #endif /* __BIG_ENDIAN__ */
2992 temp += sizeof(mtp_uint16);
2994 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2996 for (ii = 0, node = prop->propinfo.supp_value_list.start;
2997 ii < prop->propinfo.supp_value_list.nnodes;
2998 ii++, node = node->link) {
3001 _prop_size_ptpstring((ptp_string_t *) node->value);
3002 if (bytes_to_write !=
3003 _prop_pack_ptpstring((ptp_string_t *) node->value,
3004 temp, bytes_to_write)) {
3005 return (mtp_uint32) (temp - buf);
3007 temp += bytes_to_write;
3010 mtp_uint32 value = 0;
3012 for (ii = 0, node = prop->propinfo.supp_value_list.start;
3013 ii < prop->propinfo.supp_value_list.nnodes;
3014 ii++, node = node->link) {
3016 value = (mtp_uint32)node->value;
3017 memcpy(temp, &value, prop->propinfo.dts_size);
3018 #ifdef __BIG_ENDIAN__
3019 _util_conv_byte_order(temp, prop->propinfo.dts_size);
3020 #endif /* __BIG_ENDIAN__ */
3021 temp += prop->propinfo.dts_size;
3026 case DATE_TIME_FORM:
3029 case REGULAR_EXPRESSION_FORM:
3030 bytes_to_write = _prop_size_ptpstring(prop->prop_forms.reg_exp);
3031 if (bytes_to_write !=
3032 _prop_pack_ptpstring(prop->prop_forms.reg_exp,
3033 temp, bytes_to_write)) {
3035 return (mtp_uint32)(temp - buf);
3037 temp += bytes_to_write;
3040 case BYTE_ARRAY_FORM:
3041 case LONG_STRING_FORM:
3042 memcpy(temp, &prop->prop_forms.max_len,
3043 sizeof(prop->prop_forms.max_len));
3044 #ifdef __BIG_ENDIAN__
3045 _util_conv_byte_order(temp, sizeof(prop->prop_forms.max_len));
3046 #endif /* __BIG_ENDIAN__ */
3047 temp += sizeof(prop->prop_forms.max_len);
3051 /*don't know how to handle */
3056 return (mtp_uint32)(temp - buf);
3059 mtp_uint32 _prop_pack_default_val_obj_prop_desc(obj_prop_desc_t *prop,
3060 mtp_uchar *buf, mtp_uint32 size)
3062 mtp_uint32 bytes_to_write;
3064 bytes_to_write = __get_size_default_val_obj_prop_desc(prop);
3066 if ((!bytes_to_write) || (buf == NULL) || (size < bytes_to_write))
3069 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
3070 if (bytes_to_write !=
3071 _prop_pack_ptpstring(prop->propinfo.default_val.str,
3072 buf, bytes_to_write)) {
3075 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
3076 PTP_DATATYPE_ARRAY) {
3077 if (bytes_to_write !=
3078 _prop_pack_ptparray(prop->propinfo.default_val.array,
3079 buf, bytes_to_write)) {
3082 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
3083 PTP_DATATYPE_VALUE) {
3084 /* this property is of type UINT8, ... */
3085 memcpy(buf, prop->propinfo.default_val.integer, bytes_to_write);
3086 #ifdef __BIG_ENDIAN__
3087 _util_conv_byte_order(buf, bytes_to_write);
3088 #endif /* __BIG_ENDIAN__ */
3093 return bytes_to_write;
3096 obj_prop_desc_t *_prop_get_obj_prop_desc(mtp_uint32 format_code,
3097 mtp_uint32 propcode)
3100 int num_default_obj_props = 0;
3103 if (_get_oma_drm_status() == TRUE)
3104 num_default_obj_props = NUM_OBJECT_PROP_DESC_DEFAULT;
3106 num_default_obj_props = NUM_OBJECT_PROP_DESC_DEFAULT - 1;
3108 for (i = 0; i < num_default_obj_props; i++) {
3109 if (props_list_default[i].propinfo.prop_code == propcode)
3110 return &(props_list_default[i]);
3113 switch (format_code) {
3116 for (i = 0; i < NUM_OBJECT_PROP_DESC_MP3; i++) {
3117 if (props_list_mp3[i].propinfo.prop_code == propcode)
3118 return &(props_list_mp3[i]);
3122 for (i = 0; i < NUM_OBJECT_PROP_DESC_WMA; i++) {
3123 if (props_list_wma[i].propinfo.prop_code == propcode)
3124 return &(props_list_wma[i]);
3133 for (i = 0; i < NUM_OBJECT_PROP_DESC_WMV; i++) {
3134 if (props_list_wmv[i].propinfo.prop_code == propcode)
3135 return &(props_list_wmv[i]);
3138 case MTP_FMT_ABSTRACT_AUDIO_ALBUM:
3139 case PTP_FMT_IMG_EXIF:
3140 case PTP_FMT_IMG_GIF:
3141 case PTP_FMT_IMG_BMP:
3142 case PTP_FMT_IMG_PNG:
3143 for (i = 0; i < NUM_OBJECT_PROP_DESC_ALBUM; i++) {
3144 if (props_list_album[i].propinfo.prop_code == propcode)
3145 return &(props_list_album[i]);
3153 ERR("No matched property[0x%x], format[0x%x]!!\n", propcode,
3158 static void __destroy_obj_prop_desc(obj_prop_desc_t *prop)
3160 slist_node_t *node = NULL;
3161 slist_node_t *next_node = NULL;
3164 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
3166 if (prop->propinfo.default_val.str) {
3168 _prop_destroy_ptpstring(prop->propinfo.default_val.str);
3169 prop->propinfo.default_val.str = NULL;
3172 if (prop->propinfo.form_flag == ENUM_FORM) {
3174 for (node = prop->propinfo.supp_value_list.start, ii = 0;
3175 ii < prop->propinfo.supp_value_list.nnodes;
3176 node = node->link, ii++) {
3177 _prop_destroy_ptpstring((ptp_string_t *) node->value);
3181 if (prop->propinfo.form_flag == REGULAR_EXPRESSION_FORM) {
3183 if (prop->prop_forms.reg_exp != NULL) {
3184 _prop_destroy_ptpstring(prop->prop_forms.reg_exp);
3185 prop->prop_forms.reg_exp = NULL;
3188 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
3189 PTP_DATATYPE_ARRAY) {
3191 if (prop->propinfo.default_val.array) {
3193 _prop_destroy_ptparray(prop->propinfo.default_val.array);
3194 prop->propinfo.default_val.array = NULL;
3198 /* deallocate memory consumed by list elements */
3199 next_node = prop->propinfo.supp_value_list.start;
3200 for (ii = 0; ii < prop->propinfo.supp_value_list.nnodes; ii++) {
3202 next_node = next_node->link;
3208 /* Objectproplist functions */
3209 static mtp_uint32 __count_obj_proplist(obj_proplist_t *prop_list)
3211 return prop_list->prop_quad_list.nnodes;
3214 mtp_uint32 _prop_size_obj_proplist(obj_proplist_t *prop_list)
3216 prop_quad_t *quad = NULL;
3217 slist_node_t *node = NULL;
3221 /* for the NumberOfElements field in objpropvalList Dataset */
3222 size = sizeof(mtp_uint32);
3224 /* add all the fixed length members of the list */
3225 size += prop_list->prop_quad_list.nnodes * (sizeof(mtp_uint32) +
3226 sizeof(mtp_uint16) + sizeof(mtp_uint16));
3227 node = prop_list->prop_quad_list.start;
3228 for (ii = 0; ii < prop_list->prop_quad_list.nnodes; ii++) {
3229 quad = (prop_quad_t *) node->value;
3231 size += quad->val_size;
3238 mtp_uint32 _prop_get_obj_proplist(mtp_obj_t *obj, mtp_uint32 propcode,
3239 mtp_uint32 group_code, obj_proplist_t *prop_list)
3241 obj_prop_val_t *propval = NULL;
3242 slist_node_t *node = NULL;
3245 if (obj->propval_list.nnodes == 0) {
3246 if (FALSE == _prop_update_property_values_list(obj)) {
3247 ERR("update Property Values FAIL!!");
3251 for (ii = 0, node = obj->propval_list.start;
3252 ii < obj->propval_list.nnodes;
3253 ii++, node = node->link) {
3254 propval = (obj_prop_val_t *)node->value;
3256 if (NULL == propval)
3259 if (FALSE == __check_object_propcode(propval->prop,
3260 propcode, group_code)) {
3263 __append_obj_proplist(prop_list, obj->obj_handle,
3264 propval->prop->propinfo.prop_code,
3265 propval->prop->propinfo.data_type,
3266 (mtp_uchar *)propval->current_val.integer);
3269 return __count_obj_proplist(prop_list);
3272 mtp_bool _prop_update_property_values_list(mtp_obj_t *obj)
3275 mtp_char guid[16] = { 0 };
3276 slist_node_t *node = NULL;
3277 slist_node_t *next_node = NULL;
3278 ptp_time_string_t create_tm, modify_tm;
3279 mtp_uint32 fmt_code = obj->obj_info->obj_fmt;
3280 mtp_wchar buf[MTP_MAX_PATHNAME_SIZE+1] = { 0 };
3281 mtp_char file_name[MTP_MAX_FILENAME_SIZE + 1] = { 0 };
3282 mtp_wchar w_file_name[MTP_MAX_FILENAME_SIZE + 1] = { 0 };
3283 char filename_wo_extn[MTP_MAX_PATHNAME_SIZE + 1] = { 0 };
3284 mtp_wchar object_fullpath[MTP_MAX_PATHNAME_SIZE * 2 + 1] = { 0 };
3286 retv_if(obj == NULL, FALSE);
3287 retv_if(obj->obj_info == NULL, FALSE);
3289 if (obj->propval_list.nnodes > 0) {
3291 * Remove all the old property value,
3292 * and ready to set up new list
3294 for (ii = 0, next_node = obj->propval_list.start;
3295 ii < obj->propval_list.nnodes; ii++) {
3297 next_node = node->link;
3298 _prop_destroy_obj_propval((obj_prop_val_t *)
3302 obj->propval_list.start = NULL;
3303 obj->propval_list.end = NULL;
3304 obj->propval_list.nnodes = 0;
3308 /* Populate Object Info to Object properties */
3309 if (obj->file_path == NULL || obj->file_path[0] != '/') {
3310 ERR_SECURE("Path is not valid.. path = [%s]\n",
3316 retv_if(FALSE == __create_prop_integer(obj,
3317 MTP_OBJ_PROPERTYCODE_STORAGEID,
3318 obj->obj_info->store_id), FALSE);
3321 retv_if(FALSE == __create_prop_integer(obj,
3322 MTP_OBJ_PROPERTYCODE_OBJECTFORMAT,
3323 obj->obj_info->obj_fmt), FALSE);
3325 /*PROTECTION STATUS*/
3326 retv_if(FALSE == __create_prop_integer(obj,
3327 MTP_OBJ_PROPERTYCODE_PROTECTIONSTATUS,
3328 obj->obj_info->protcn_status), FALSE);
3331 retv_if(FALSE == __create_prop_integer(obj,
3332 MTP_OBJ_PROPERTYCODE_OBJECTSIZE,
3333 obj->obj_info->file_size), FALSE);
3336 _util_get_file_name(obj->file_path, file_name);
3337 _util_utf8_to_utf16(w_file_name, sizeof(w_file_name) / WCHAR_SIZ, file_name);
3338 retv_if(FALSE == __create_prop_string(obj,
3339 MTP_OBJ_PROPERTYCODE_OBJECTFILENAME, w_file_name), FALSE);
3342 retv_if(FALSE == __create_prop_integer(obj,
3343 MTP_OBJ_PROPERTYCODE_PARENT, obj->obj_info->h_parent), FALSE);
3346 _util_utf8_to_utf16(object_fullpath,
3347 sizeof(object_fullpath) / WCHAR_SIZ, obj->file_path);
3348 _util_conv_wstr_to_guid(object_fullpath, (mtp_uint64 *) guid);
3349 retv_if((FALSE == __create_prop_array(obj,
3350 MTP_OBJ_PROPERTYCODE_PERSISTENTGUID,
3351 guid, sizeof(guid))), FALSE);
3354 retv_if(FALSE == __create_prop_integer(obj,
3355 MTP_OBJ_PROPERTYCODE_NONCONSUMABLE, 0), FALSE);
3357 _entity_get_file_times(obj, &create_tm, &modify_tm);
3359 retv_if(FALSE == __create_prop_timestring(obj, MTP_OBJ_PROPERTYCODE_DATEMODIFIED,
3360 &modify_tm), FALSE);
3363 retv_if(FALSE == __create_prop_timestring(obj, MTP_OBJ_PROPERTYCODE_DATECREATED,
3364 &create_tm), FALSE);
3367 _util_get_file_name_wo_extn(obj->file_path,
3369 _util_utf8_to_utf16(buf, sizeof(buf) / WCHAR_SIZ, filename_wo_extn);
3370 retv_if(FALSE == __create_prop_string(obj,
3371 MTP_OBJ_PROPERTYCODE_NAME, buf), FALSE);
3373 /*ASSOCIATION TYPE*/
3374 retv_if(FALSE == __create_prop_integer(obj,
3375 MTP_OBJ_PROPERTYCODE_ASSOCIATIONTYPE,
3376 obj->obj_info->association_type), FALSE);
3379 if (_get_oma_drm_status() == TRUE) {
3380 retv_if(FALSE == __create_prop_integer(obj,
3381 MTP_OBJ_PROPERTYCODE_OMADRMSTATUS, 0), FALSE);
3385 if (fmt_code == PTP_FMT_MP3 ||
3386 fmt_code == MTP_FMT_WMA ||
3387 fmt_code == PTP_FMT_WAVE ||
3388 fmt_code == MTP_FMT_FLAC) {
3389 __update_prop_values_audio(obj);
3391 } else if (fmt_code == MTP_FMT_WMV ||
3392 fmt_code == PTP_FMT_ASF ||
3393 fmt_code == MTP_FMT_MP4 ||
3394 fmt_code == PTP_FMT_AVI ||
3395 fmt_code == PTP_FMT_MPEG) {
3396 __update_prop_values_video(obj);
3398 } else if (fmt_code == PTP_FMT_IMG_EXIF ||
3399 fmt_code == PTP_FMT_IMG_BMP ||
3400 fmt_code == PTP_FMT_IMG_GIF ||
3401 fmt_code == PTP_FMT_IMG_PNG) {
3402 __update_prop_values_image(obj);
3408 static mtp_bool __append_obj_proplist(obj_proplist_t *prop_list, mtp_uint32 obj_handle,
3409 mtp_uint16 propcode, mtp_uint32 data_type, mtp_uchar *val)
3411 ptp_string_t *str = NULL;
3412 prop_quad_t *quad = NULL;
3413 ptp_array_t *arr_uint8;
3414 ptp_array_t *arr_uint16;
3415 ptp_array_t *arr_uint32;
3417 quad = (prop_quad_t *)g_malloc(sizeof(prop_quad_t));
3421 quad->obj_handle = obj_handle;
3422 quad->prop_code = propcode;
3423 quad->data_type = data_type;
3426 switch (data_type) {
3427 case PTP_DATATYPE_UINT8:
3428 case PTP_DATATYPE_INT8:
3429 quad->val_size = sizeof(mtp_uchar);
3432 case PTP_DATATYPE_UINT16:
3433 case PTP_DATATYPE_INT16:
3434 quad->val_size = sizeof(mtp_uint16);
3437 case PTP_DATATYPE_UINT32:
3438 case PTP_DATATYPE_INT32:
3439 quad->val_size = sizeof(mtp_uint32);
3442 case PTP_DATATYPE_UINT64:
3443 case PTP_DATATYPE_INT64:
3444 quad->val_size = sizeof(mtp_int64);
3447 case PTP_DATATYPE_UINT128:
3448 case PTP_DATATYPE_INT128:
3449 quad->val_size = 2 * sizeof(mtp_int64);
3452 case PTP_DATATYPE_AUINT8:
3453 case PTP_DATATYPE_AINT8:
3454 memcpy(&arr_uint8, val, sizeof(ptp_array_t *));
3455 quad->val_size = (arr_uint8 != NULL) ?
3456 _prop_get_size_ptparray(arr_uint8) : 0;
3457 quad->pval = (mtp_uchar *)arr_uint8;
3460 case PTP_DATATYPE_AUINT16:
3461 case PTP_DATATYPE_AINT16:
3462 memcpy(&arr_uint16, val, sizeof(ptp_array_t *));
3463 quad->val_size = (arr_uint16 != NULL) ?
3464 _prop_get_size_ptparray(arr_uint16) : 0;
3465 quad->pval = (mtp_uchar *)arr_uint16;
3468 case PTP_DATATYPE_AUINT32:
3469 case PTP_DATATYPE_AINT32:
3470 memcpy(&arr_uint32, val, sizeof(ptp_array_t *));
3471 quad->val_size = (arr_uint32 != NULL) ? _prop_get_size_ptparray(arr_uint32) : 0;
3472 quad->pval = (mtp_uchar *)arr_uint32;
3475 case PTP_DATATYPE_STRING:
3476 memcpy(&str, val, sizeof(ptp_string_t *));
3477 quad->val_size = (str != NULL) ? _prop_size_ptpstring(str) : 1;
3478 quad->pval = (mtp_uchar *)str;
3486 _util_add_node(&(prop_list->prop_quad_list), quad);
3490 mtp_uint32 _prop_pack_obj_proplist(obj_proplist_t *prop_list, mtp_uchar *buf,
3493 mtp_uchar *temp = buf;
3494 ptp_string_t *str = NULL;
3495 prop_quad_t *quad = NULL;
3497 slist_node_t *node = NULL;
3499 if (!buf || size < _prop_size_obj_proplist(prop_list))
3502 *(mtp_uint32 *) buf = prop_list->prop_quad_list.nnodes;
3503 #ifdef __BIG_ENDIAN__
3504 _util_conv_byte_order(temp, sizeof(mtp_uint32));
3505 #endif /* __BIG_ENDIAN__ */
3506 temp += sizeof(mtp_uint32);
3508 /* Pack the array elements */
3509 node = prop_list->prop_quad_list.start;
3510 for (ii = 0; ii < prop_list->prop_quad_list.nnodes; ii++) {
3511 quad = (prop_quad_t *) node->value;
3513 /* pack the fixed length members */
3514 memcpy(temp, &quad->obj_handle, sizeof(mtp_uint32));
3515 #ifdef __BIG_ENDIAN__
3516 _util_conv_byte_order(temp, sizeof(mtp_uint32));
3517 #endif /* __BIG_ENDIAN__ */
3518 temp += sizeof(mtp_uint32);
3520 memcpy(temp, &quad->prop_code, sizeof(mtp_uint16));
3521 #ifdef __BIG_ENDIAN__
3522 _util_conv_byte_order(temp, sizeof(mtp_uint32));
3523 #endif /* __BIG_ENDIAN__ */
3524 temp += sizeof(mtp_uint16);
3526 memcpy(temp, &quad->data_type, sizeof(mtp_uint16));
3527 #ifdef __BIG_ENDIAN__
3528 _util_conv_byte_order(temp, sizeof(mtp_uint32));
3529 #endif /* __BIG_ENDIAN__ */
3530 temp += sizeof(mtp_uint16);
3532 /* Pack property value */
3533 if ((quad->data_type & PTP_DATATYPE_VALUEMASK) ==
3534 PTP_DATATYPE_VALUE) {
3536 memcpy(temp, quad->pval, quad->val_size);
3537 #ifdef __BIG_ENDIAN__
3538 _util_conv_byte_order(temp, quad->val_size);
3539 #endif /* __BIG_ENDIAN__ */
3540 temp += quad->val_size;
3542 } else if (quad->data_type == PTP_DATATYPE_STRING) {
3544 str = (ptp_string_t *) quad->pval;
3546 temp += _prop_pack_ptpstring(str, temp,
3547 _prop_size_ptpstring(str));
3549 /* Put in an empty string: NumOfChars = 0; */
3552 } else if ((quad->data_type & PTP_DATATYPE_ARRAYMASK) ==
3553 PTP_DATATYPE_ARRAY) {
3555 if (quad->pval != NULL) {
3557 if (quad->val_size !=
3558 _prop_pack_ptparray((ptp_array_t *)quad->pval,
3559 temp, quad->val_size)) {
3560 return (mtp_uint32) (temp - buf);
3562 temp += quad->val_size;
3564 /* Fill in an empty array: mtp_uint32 */
3565 mtp_uint32 zero = 0;
3566 memcpy(temp, &zero, sizeof(mtp_uint32));
3567 temp += sizeof(mtp_uint32);
3572 return (mtp_uint32)(temp - buf);
3575 void _prop_destroy_obj_proplist(obj_proplist_t *prop_list)
3577 slist_node_t *node = NULL;
3578 slist_node_t *next_node = NULL;
3581 for (ii = 0, node = prop_list->prop_quad_list.start;
3582 ii < prop_list->prop_quad_list.nnodes; ii++, node = node->link) {
3583 g_free(node->value);
3586 next_node = prop_list->prop_quad_list.start;
3588 for (ii = 0; ii < prop_list->prop_quad_list.nnodes; ii++) {
3590 next_node = node->link;
3596 mtp_bool _prop_add_supp_integer_val(prop_info_t *prop_info, mtp_uint32 value)
3598 if (((prop_info->data_type & PTP_DATATYPE_VALUEMASK) !=
3599 PTP_DATATYPE_VALUE) || (prop_info->form_flag != ENUM_FORM)) {
3603 /* Create the node and append it. */
3604 _util_add_node(&(prop_info->supp_value_list), (void *)value);
3609 mtp_bool _prop_add_supp_string_val(prop_info_t *prop_info, mtp_wchar *val)
3611 ptp_string_t *str = NULL;
3614 if ((prop_info->data_type != PTP_DATATYPE_STRING) ||
3615 (prop_info->form_flag != ENUM_FORM)) {
3618 #ifndef MTP_USE_VARIABLE_PTP_STRING_MALLOC
3619 str = __alloc_ptpstring();
3620 #else /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
3621 str = __alloc_ptpstring(_util_wchar_len(val));
3622 #endif /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
3625 _prop_copy_char_to_ptpstring(str, val, WCHAR_TYPE);
3626 ret = _util_add_node(&(prop_info->supp_value_list), (void *)str);
3628 ERR("List add Fail");
3637 /* ObjectProp Functions */
3638 mtp_uint32 _prop_get_supp_obj_props(mtp_uint32 format_code,
3639 ptp_array_t *supp_props)
3642 mtp_uint32 num_default_obj_props = 0;
3645 if (_get_oma_drm_status() == TRUE)
3646 num_default_obj_props = NUM_OBJECT_PROP_DESC_DEFAULT;
3648 num_default_obj_props = NUM_OBJECT_PROP_DESC_DEFAULT - 1;
3650 for (i = 0; i < num_default_obj_props; i++) {
3651 _prop_append_ele_ptparray(supp_props,
3652 props_list_default[i].propinfo.prop_code);
3655 switch (format_code) {
3658 for (i = 0; i < NUM_OBJECT_PROP_DESC_MP3; i++) {
3659 _prop_append_ele_ptparray(supp_props,
3660 props_list_mp3[i].propinfo.prop_code);
3664 for (i = 0; i < NUM_OBJECT_PROP_DESC_WMA; i++) {
3665 _prop_append_ele_ptparray(supp_props,
3666 props_list_wma[i].propinfo.prop_code);
3675 for (i = 0; i < NUM_OBJECT_PROP_DESC_WMV; i++) {
3676 _prop_append_ele_ptparray(supp_props,
3677 props_list_wmv[i].propinfo.prop_code);
3680 case MTP_FMT_ABSTRACT_AUDIO_ALBUM:
3681 case PTP_FMT_IMG_EXIF:
3682 case PTP_FMT_IMG_GIF:
3683 case PTP_FMT_IMG_BMP:
3684 case PTP_FMT_IMG_PNG:
3685 for (i = 0; i < NUM_OBJECT_PROP_DESC_ALBUM; i++) {
3686 _prop_append_ele_ptparray(supp_props,
3687 props_list_album[i].propinfo.prop_code);
3693 DBG("getsupp_props : format [0x%x], supported list [%d]\n",
3694 format_code, supp_props->num_ele);
3695 return supp_props->num_ele;
3698 mtp_bool _prop_build_supp_props_default(void)
3700 mtp_wchar temp[MTP_MAX_REG_STRING + 1] = { 0 };
3701 static mtp_bool initialized = FALSE;
3703 mtp_uint32 default_val;
3705 if (initialized == TRUE) {
3706 DBG("already supported list is in there. just return!!");
3711 * MTP_OBJ_PROPERTYCODE_STORAGEID (1)
3713 __init_obj_prop_desc(&(props_list_default[i]),
3714 MTP_OBJ_PROPERTYCODE_STORAGEID,
3715 PTP_DATATYPE_UINT32,
3716 PTP_PROPGETSET_GETONLY,
3718 MTP_PROP_GROUPCODE_GENERAL);
3721 _prop_set_default_integer(&(props_list_default[i].propinfo),
3722 (mtp_uchar *)&default_val);
3726 * MTP_OBJ_PROPERTYCODE_OBJECTFORMAT (2)
3728 __init_obj_prop_desc(&(props_list_default[i]),
3729 MTP_OBJ_PROPERTYCODE_OBJECTFORMAT,
3730 PTP_DATATYPE_UINT16,
3731 PTP_PROPGETSET_GETONLY,
3733 MTP_PROP_GROUPCODE_GENERAL);
3735 default_val = PTP_FMT_UNDEF;
3736 _prop_set_default_integer(&(props_list_default[i].propinfo),
3737 (mtp_uchar *)&default_val);
3741 * MTP_OBJ_PROPERTYCODE_PROTECTIONSTATUS (3)
3743 __init_obj_prop_desc(&(props_list_default[i]),
3744 MTP_OBJ_PROPERTYCODE_PROTECTIONSTATUS,
3745 PTP_DATATYPE_UINT16,
3746 PTP_PROPGETSET_GETONLY,
3748 MTP_PROP_GROUPCODE_GENERAL);
3750 default_val = PTP_PROTECTIONSTATUS_NOPROTECTION;
3751 _prop_add_supp_integer_val(&(props_list_default[i].propinfo),
3752 PTP_PROTECTIONSTATUS_NOPROTECTION);
3753 _prop_add_supp_integer_val(&(props_list_default[i].propinfo),
3754 PTP_PROTECTIONSTATUS_READONLY);
3755 _prop_add_supp_integer_val(&(props_list_default[i].propinfo),
3756 MTP_PROTECTIONSTATUS_READONLY_DATA);
3757 _prop_add_supp_integer_val(&(props_list_default[i].propinfo),
3758 (mtp_uint32)MTP_PROTECTIONSTATUS_NONTRANSFERABLE_DATA);
3759 _prop_set_default_integer(&(props_list_default[i].propinfo),
3760 (mtp_uchar *)&default_val);
3764 * MTP_OBJ_PROPERTYCODE_OBJECTSIZE (4)
3766 __init_obj_prop_desc(&(props_list_default[i]),
3767 MTP_OBJ_PROPERTYCODE_OBJECTSIZE,
3768 PTP_DATATYPE_UINT64,
3769 PTP_PROPGETSET_GETONLY,
3771 MTP_PROP_GROUPCODE_GENERAL);
3773 _prop_add_supp_integer_val(&(props_list_default[i].propinfo), 0x0);
3777 * MTP_OBJ_PROPERTYCODE_OBJECTFILENAME (5)
3779 __init_obj_prop_desc(&(props_list_default[i]),
3780 MTP_OBJ_PROPERTYCODE_OBJECTFILENAME,
3781 PTP_DATATYPE_STRING,
3782 PTP_PROPGETSET_GETSET,
3783 REGULAR_EXPRESSION_FORM,
3784 MTP_PROP_GROUPCODE_GENERAL);
3786 _util_utf8_to_utf16(temp, sizeof(temp) / WCHAR_SIZ,
3787 "[a-zA-Z!#\\$%&`\\(\\)\\-0-9@\\^_\\'\\{\\}\\~]{1,8}\\.[[a-zA-Z!#\\$%&`\\(\\)\\-0-9@\\^_\\'\\{\\}\\~]{1,3}]");
3788 _prop_set_regexp(&(props_list_default[i]), temp);
3790 _util_utf8_to_utf16(temp, sizeof(temp) / WCHAR_SIZ, "");
3791 _prop_set_default_string(&(props_list_default[i].propinfo), temp);
3795 * MTP_OBJ_PROPERTYCODE_PARENT (6)
3797 __init_obj_prop_desc(&(props_list_default[i]),
3798 MTP_OBJ_PROPERTYCODE_PARENT,
3799 PTP_DATATYPE_UINT32,
3800 PTP_PROPGETSET_GETONLY,
3802 MTP_PROP_GROUPCODE_GENERAL);
3805 _prop_set_default_integer(&(props_list_default[i].propinfo),
3806 (mtp_uchar *) &default_val);
3810 * MTP_OBJ_PROPERTYCODE_PERSISTENTGUID (7)
3812 __init_obj_prop_desc(&(props_list_default[i]),
3813 MTP_OBJ_PROPERTYCODE_PERSISTENTGUID,
3814 PTP_DATATYPE_UINT128,
3815 PTP_PROPGETSET_GETONLY,
3817 MTP_PROP_GROUPCODE_GENERAL);
3820 mtp_uchar guid[16] = { 0 };
3821 _prop_set_default_integer(&(props_list_default[i].propinfo),
3827 * MTP_OBJ_PROPERTYCODE_NONCONSUMABLE (8)
3829 __init_obj_prop_desc(&(props_list_default[i]),
3830 MTP_OBJ_PROPERTYCODE_NONCONSUMABLE,
3832 PTP_PROPGETSET_GETONLY,
3834 MTP_PROP_GROUPCODE_GENERAL);
3837 _prop_add_supp_integer_val(&(props_list_default[i].propinfo), 0x0);
3838 _prop_add_supp_integer_val(&(props_list_default[i].propinfo), 0x1);
3839 _prop_set_default_integer(&(props_list_default[i].propinfo),
3840 (mtp_uchar *)&default_val);
3844 *MTP_OBJ_PROPERTYCODE_DATEMODIFIED (9)
3846 __init_obj_prop_desc(&(props_list_default[i]),
3847 MTP_OBJ_PROPERTYCODE_DATEMODIFIED,
3848 PTP_DATATYPE_STRING,
3849 PTP_PROPGETSET_GETONLY,
3851 MTP_PROP_GROUPCODE_GENERAL);
3853 _prop_set_default_string(&(props_list_default[i].propinfo), temp);
3857 * MTP_OBJ_PROPERTYCODE_DATECREATED (10)
3859 __init_obj_prop_desc(&(props_list_default[i]),
3860 MTP_OBJ_PROPERTYCODE_DATECREATED,
3861 PTP_DATATYPE_STRING,
3862 PTP_PROPGETSET_GETONLY,
3864 MTP_PROP_GROUPCODE_GENERAL);
3866 _prop_set_default_string(&(props_list_default[i].propinfo), temp);
3870 * MTP_OBJ_PROPERTYCODE_NAME (11)
3872 __init_obj_prop_desc(&(props_list_default[i]),
3873 MTP_OBJ_PROPERTYCODE_NAME,
3874 PTP_DATATYPE_STRING,
3875 PTP_PROPGETSET_GETONLY,
3877 MTP_PROP_GROUPCODE_GENERAL);
3879 _prop_set_default_string(&(props_list_default[i].propinfo), temp);
3883 * MTP_OBJ_PROPERTYCODE_ASSOCIATIONTYPE (12)
3885 __init_obj_prop_desc(&(props_list_default[i]),
3886 MTP_OBJ_PROPERTYCODE_ASSOCIATIONTYPE,
3887 PTP_DATATYPE_UINT16,
3888 PTP_PROPGETSET_GETSET,
3890 MTP_PROP_GROUPCODE_GENERAL);
3892 default_val = PTP_ASSOCIATIONTYPE_UNDEFINED;
3893 _prop_add_supp_integer_val(&(props_list_default[i].propinfo),
3894 PTP_ASSOCIATIONTYPE_UNDEFINED);
3895 _prop_add_supp_integer_val(&(props_list_default[i].propinfo),
3896 PTP_ASSOCIATIONTYPE_FOLDER);
3897 _prop_set_default_integer(&(props_list_default[i].propinfo),
3898 (mtp_uchar *)&default_val);
3900 if (_get_oma_drm_status() == TRUE) {
3902 * MTP_OBJ_PROPERTYCODE_OMADRMSTATUS (13)
3905 __init_obj_prop_desc(&(props_list_default[i]),
3906 MTP_OBJ_PROPERTYCODE_OMADRMSTATUS,
3908 PTP_PROPGETSET_GETONLY,
3910 MTP_PROP_GROUPCODE_GENERAL);
3913 _prop_add_supp_integer_val(&(props_list_default[i].propinfo), 0);
3914 _prop_add_supp_integer_val(&(props_list_default[i].propinfo), 1);
3915 _prop_set_default_integer(&(props_list_default[i].propinfo),
3916 (mtp_uchar *)&default_val);
3924 mtp_bool _prop_build_supp_props_mp3(void)
3926 static mtp_bool initialized = FALSE;
3928 mtp_uint32 default_val;
3930 if (initialized == TRUE) {
3931 DBG("already supported list is in there. just return!!");
3935 /*Common properties 1 - 8 */
3936 __build_supported_common_props(&i, &props_list_mp3[i]);
3939 * MTP_OBJ_PROPERTYCODE_AUDIOBITRATE (9)
3941 __init_obj_prop_desc(&(props_list_mp3[i]),
3942 MTP_OBJ_PROPERTYCODE_AUDIOBITRATE,
3943 PTP_DATATYPE_UINT32,
3944 PTP_PROPGETSET_GETONLY,
3946 MTP_PROP_GROUPCODE_OBJECT);
3948 default_val = MTP_AUDIO_BITRATE_UNKNOWN;
3949 _prop_set_range_integer(&(props_list_mp3[i].propinfo),
3950 MTP_AUDIO_BITRATE_UNKNOWN, MTP_AUDIO_BITRATE_BLUERAY, 1L);
3951 _prop_set_default_integer(&(props_list_mp3[i].propinfo),
3952 (mtp_uchar *)&default_val);
3956 * MTP_OBJ_PROPERTYCODE_SAMPLERATE (10)
3958 __init_obj_prop_desc(&(props_list_mp3[i]),
3959 MTP_OBJ_PROPERTYCODE_SAMPLERATE,
3960 PTP_DATATYPE_UINT32,
3961 PTP_PROPGETSET_GETONLY,
3963 MTP_PROP_GROUPCODE_OBJECT);
3965 default_val = MTP_AUDIO_SAMPLERATE_UNKNOWN;
3966 _prop_set_range_integer(&(props_list_mp3[i].propinfo),
3967 MTP_AUDIO_SAMPLERATE_8K, MTP_AUDIO_SAMPLERATE_48K, 1L);
3968 _prop_set_default_integer(&(props_list_mp3[i].propinfo),
3969 (mtp_uchar *)&default_val);
3973 * MTP_OBJ_PROPERTYCODE_NUMBEROFCHANNELS (11)
3975 __init_obj_prop_desc(&(props_list_mp3[i]),
3976 MTP_OBJ_PROPERTYCODE_NUMBEROFCHANNELS,
3977 PTP_DATATYPE_UINT16,
3978 PTP_PROPGETSET_GETONLY,
3980 MTP_PROP_GROUPCODE_OBJECT);
3982 default_val = MTP_CHANNELS_MONO;
3983 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
3984 MTP_CHANNELS_NOT_USED);
3985 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
3987 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
3988 MTP_CHANNELS_STEREO);
3989 _prop_set_default_integer(&(props_list_mp3[i].propinfo),
3990 (mtp_uchar *)&default_val);
3994 * MTP_OBJ_PROPERTYCODE_AUDIOWAVECODEC (12)
3996 __init_obj_prop_desc(&(props_list_mp3[i]),
3997 MTP_OBJ_PROPERTYCODE_AUDIOWAVECODEC,
3998 PTP_DATATYPE_UINT32,
3999 PTP_PROPGETSET_GETONLY,
4001 MTP_PROP_GROUPCODE_OBJECT);
4003 default_val = MTP_WAVEFORMAT_UNKNOWN;
4004 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4005 MTP_WAVEFORMAT_UNKNOWN);
4006 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4007 MTP_WAVEFORMAT_PCM);
4008 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4009 MTP_WAVEFORMAT_ADPCM);
4010 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4011 MTP_WAVEFORMAT_IEEEFLOAT);
4012 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4013 MTP_WAVEFORMAT_DTS);
4014 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4015 MTP_WAVEFORMAT_DRM);
4016 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4017 MTP_WAVEFORMAT_WMSP2);
4018 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4019 MTP_WAVEFORMAT_GSM610);
4020 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4021 MTP_WAVEFORMAT_MSNAUDIO);
4022 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4023 MTP_WAVEFORMAT_MPEG);
4024 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4025 MTP_WAVEFORMAT_MPEGLAYER3);
4026 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4027 MTP_WAVEFORMAT_MSAUDIO1);
4028 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4029 MTP_WAVEFORMAT_MSAUDIO2);
4030 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4031 MTP_WAVEFORMAT_MSAUDIO3);
4032 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4033 MTP_WAVEFORMAT_WMAUDIOLOSSLESS);
4034 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4035 MTP_WAVEFORMAT_WMASPDIF);
4036 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4037 MTP_WAVEFORMAT_AAC);
4038 _prop_set_default_integer(&(props_list_mp3[i].propinfo),
4039 (mtp_uchar *)&default_val);
4043 * MTP_OBJ_PROPERTYCODE_DESCRIPTION (13)
4045 __init_obj_prop_desc(&(props_list_mp3[i]),
4046 MTP_OBJ_PROPERTYCODE_DESCRIPTION,
4047 PTP_DATATYPE_AUINT16,
4048 PTP_PROPGETSET_GETONLY,
4050 MTP_PROP_GROUPCODE_GENERAL);
4052 _prop_set_maxlen(&(props_list_mp3[i]), MAX_PTP_STRING_CHARS);
4053 _prop_set_default_array(&(props_list_mp3[i].propinfo), NULL, 0);
4057 * MTP_OBJ_PROPERTYCODE_COPYRIGHTINFO (14)
4059 __init_obj_prop_desc(&(props_list_mp3[i]),
4060 MTP_OBJ_PROPERTYCODE_COPYRIGHTINFO,
4061 PTP_DATATYPE_AUINT16,
4062 PTP_PROPGETSET_GETONLY,
4064 MTP_PROP_GROUPCODE_GENERAL);
4066 _prop_set_maxlen(&(props_list_mp3[i]), MAX_PTP_STRING_CHARS);
4067 _prop_set_default_array(&(props_list_mp3[i].propinfo), NULL, 0);
4073 mtp_bool _prop_build_supp_props_wma(void)
4075 static mtp_bool initialized = FALSE;
4077 mtp_uint32 default_val;
4079 if (initialized == TRUE) {
4080 DBG("already supported list is in there. just return!!");
4084 /*Common properties 1 - 8 */
4085 __build_supported_common_props(&i, &props_list_wma[i]);
4087 * MTP_OBJ_PROPERTYCODE_AUDIOBITRATE (9)
4089 __init_obj_prop_desc(&(props_list_wma[i]),
4090 MTP_OBJ_PROPERTYCODE_AUDIOBITRATE,
4091 PTP_DATATYPE_UINT32,
4092 PTP_PROPGETSET_GETONLY,
4094 MTP_PROP_GROUPCODE_OBJECT);
4096 default_val = MTP_AUDIO_BITRATE_UNKNOWN;
4097 _prop_set_range_integer(&(props_list_wma[i].propinfo),
4098 MTP_AUDIO_BITRATE_UNKNOWN, MTP_AUDIO_BITRATE_BLUERAY, 1L);
4099 _prop_set_default_integer(&(props_list_wma[i].propinfo),
4100 (mtp_uchar *)&default_val);
4104 * MTP_OBJ_PROPERTYCODE_SAMPLERATE (10)
4106 __init_obj_prop_desc(&(props_list_wma[i]),
4107 MTP_OBJ_PROPERTYCODE_SAMPLERATE,
4108 PTP_DATATYPE_UINT32,
4109 PTP_PROPGETSET_GETONLY,
4111 MTP_PROP_GROUPCODE_OBJECT);
4113 default_val = MTP_AUDIO_SAMPLERATE_UNKNOWN;
4114 _prop_set_range_integer(&(props_list_wma[i].propinfo),
4115 MTP_AUDIO_SAMPLERATE_8K, MTP_AUDIO_SAMPLERATE_48K, 1L);
4116 _prop_set_default_integer(&(props_list_wma[i]).propinfo,
4117 (mtp_uchar *)&default_val);
4121 * MTP_OBJ_PROPERTYCODE_NUMBEROFCHANNELS (11)
4123 __init_obj_prop_desc(&(props_list_wma[i]),
4124 MTP_OBJ_PROPERTYCODE_NUMBEROFCHANNELS,
4125 PTP_DATATYPE_UINT16,
4126 PTP_PROPGETSET_GETONLY,
4128 MTP_PROP_GROUPCODE_OBJECT);
4130 default_val = MTP_CHANNELS_MONO;
4131 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4132 MTP_CHANNELS_NOT_USED);
4133 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4135 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4136 MTP_CHANNELS_STEREO);
4137 _prop_set_default_integer(&(props_list_wma[i].propinfo),
4138 (mtp_uchar *)&default_val);
4142 * MTP_OBJ_PROPERTYCODE_AUDIOWAVECODEC (12)
4144 __init_obj_prop_desc(&(props_list_wma[i]),
4145 MTP_OBJ_PROPERTYCODE_AUDIOWAVECODEC,
4146 PTP_DATATYPE_UINT32,
4147 PTP_PROPGETSET_GETONLY,
4149 MTP_PROP_GROUPCODE_OBJECT);
4151 default_val = MTP_WAVEFORMAT_UNKNOWN;
4152 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4153 MTP_WAVEFORMAT_UNKNOWN);
4154 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4155 MTP_WAVEFORMAT_PCM);
4156 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4157 MTP_WAVEFORMAT_ADPCM);
4158 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4159 MTP_WAVEFORMAT_IEEEFLOAT);
4160 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4161 MTP_WAVEFORMAT_DTS);
4162 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4163 MTP_WAVEFORMAT_DRM);
4164 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4165 MTP_WAVEFORMAT_WMSP2);
4166 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4167 MTP_WAVEFORMAT_GSM610);
4168 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4169 MTP_WAVEFORMAT_MSNAUDIO);
4170 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4171 MTP_WAVEFORMAT_MPEG);
4172 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4173 MTP_WAVEFORMAT_MPEGLAYER3);
4174 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4175 MTP_WAVEFORMAT_MSAUDIO1);
4176 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4177 MTP_WAVEFORMAT_MSAUDIO2);
4178 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4179 MTP_WAVEFORMAT_MSAUDIO3);
4180 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4181 MTP_WAVEFORMAT_WMAUDIOLOSSLESS);
4182 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4183 MTP_WAVEFORMAT_WMASPDIF);
4184 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4185 MTP_WAVEFORMAT_AAC);
4186 _prop_set_default_integer(&(props_list_wma[i].propinfo),
4187 (mtp_uchar *)&default_val);
4191 * MTP_OBJ_PROPERTYCODE_DESCRIPTION (13)
4193 __init_obj_prop_desc(&(props_list_wma[i]),
4194 MTP_OBJ_PROPERTYCODE_DESCRIPTION,
4195 PTP_DATATYPE_AUINT16,
4196 PTP_PROPGETSET_GETONLY,
4198 MTP_PROP_GROUPCODE_GENERAL);
4200 _prop_set_maxlen(&(props_list_wma[i]), MAX_PTP_STRING_CHARS);
4201 _prop_set_default_array(&(props_list_wma[i].propinfo), NULL, 0);
4205 * MTP_OBJ_PROPERTYCODE_COPYRIGHTINFO (14)
4207 __init_obj_prop_desc(&(props_list_wma[i]),
4208 MTP_OBJ_PROPERTYCODE_COPYRIGHTINFO,
4209 PTP_DATATYPE_AUINT16,
4210 PTP_PROPGETSET_GETONLY,
4212 MTP_PROP_GROUPCODE_GENERAL);
4214 _prop_set_maxlen(&(props_list_wma[i]), MAX_PTP_STRING_CHARS);
4215 _prop_set_default_array(&(props_list_wma[i].propinfo), NULL, 0);
4217 /*-------------------------------------------------------------
4218 * Valid Configurations for interdependent Object properties
4219 *-------------------------------------------------------------
4221 #ifdef MTP_SUPPORT_INTERDEPENDENTPROP
4223 interdep_prop_config_t *ptr_interdep_prop_cfg = NULL;
4224 obj_prop_desc_t *prop = NULL;
4225 mtp_uint32 default_val;
4227 _util_init_list(&(interdep_proplist.plist));
4229 prop = (obj_prop_desc_t *)g_malloc(sizeof(obj_prop_desc_t) * 4);
4231 ERR("prop g_malloc fail");
4234 /* Valid config. 1 for Bit Rate and Sample Rate */
4235 ptr_interdep_prop_cfg =
4236 (interdep_prop_config_t *)g_malloc(sizeof(interdep_prop_config_t));
4237 if (!ptr_interdep_prop_cfg) {
4239 ERR("ptr_interdep_prop_config g_malloc fail");
4243 _util_init_list(&(ptr_interdep_prop_cfg->propdesc_list));
4244 if (!ptr_interdep_prop_cfg) {
4248 ptr_interdep_prop_cfg->format_code = MTP_FMT_WMA;
4251 __init_obj_prop_desc(&(prop[i]),
4252 MTP_OBJ_PROPERTYCODE_TOTALBITRATE,
4253 PTP_DATATYPE_UINT32,
4254 PTP_PROPGETSET_GETONLY,
4255 RANGE_FORM, MTP_PROP_GROUPCODE_GENERAL);
4257 default_val = MTP_AUDIO_BITRATE_192K;
4258 _prop_set_range_integer(&(prop[i].propinfo),
4259 MTP_AUDIO_BITRATE_192K,
4260 MTP_AUDIO_BITRATE_256K, 1000L);
4261 _prop_set_default_integer(&(prop[i].propinfo),
4262 (mtp_uchar *)&default_val);
4263 __append_interdep_prop(ptr_interdep_prop_cfg, &(prop[i]));
4266 __init_obj_prop_desc(&(prop[i]),
4267 MTP_OBJ_PROPERTYCODE_SAMPLERATE,
4268 PTP_DATATYPE_UINT32,
4269 PTP_PROPGETSET_GETONLY,
4270 ENUM_FORM, MTP_PROP_GROUPCODE_GENERAL);
4272 _prop_add_supp_integer_val(&(prop[i].propinfo),
4273 MTP_AUDIO_SAMPLERATE_DVD);
4274 _prop_set_default_integer(&(prop[i].propinfo),
4275 (mtp_uchar *)MTP_AUDIO_SAMPLERATE_DVD);
4276 __append_interdep_prop(ptr_interdep_prop_cfg, &(prop[i]));
4279 /* Created one valid configuration */
4282 ret = _util_add_node(&(interdep_proplist.plist),
4283 (void *)ptr_interdep_prop_cfg);
4286 ERR("List add Fail");
4290 /* Valid config. 2 for Bit Rate and Sample Rate */
4291 ptr_interdep_prop_cfg =
4292 (interdep_prop_config_t *)g_malloc(sizeof(interdep_prop_config_t));
4293 if (!ptr_interdep_prop_cfg) {
4295 ERR("ptr_interdep_prop_cfg g_malloc fail");
4298 _util_init_list(&(ptr_interdep_prop_cfg->propdesc_list));
4300 if (!ptr_interdep_prop_cfg) {
4304 ptr_interdep_prop_cfg->format_code = MTP_FMT_WMA;
4306 __init_obj_prop_desc(&(prop[i]),
4307 MTP_OBJ_PROPERTYCODE_TOTALBITRATE,
4308 PTP_DATATYPE_UINT32,
4309 PTP_PROPGETSET_GETONLY,
4310 RANGE_FORM, MTP_PROP_GROUPCODE_GENERAL);
4313 _prop_set_range_integer(&(prop[i].propinfo),
4314 MTP_AUDIO_BITRATE_GSM,
4315 MTP_AUDIO_BITRATE_BLUERAY, 1L);
4316 _prop_set_default_integer(&(prop[i].propinfo),
4317 (mtp_uchar *)&default_val);
4318 __append_interdep_prop(ptr_interdep_prop_cfg, &(prop[i]));
4321 __init_obj_prop_desc(&(prop[i]),
4322 MTP_OBJ_PROPERTYCODE_SAMPLERATE,
4323 PTP_DATATYPE_UINT32,
4324 PTP_PROPGETSET_GETONLY,
4325 ENUM_FORM, MTP_PROP_GROUPCODE_GENERAL);
4327 default_val = MTP_AUDIO_SAMPLERATE_CD;
4328 _prop_add_supp_integer_val(&(prop[i].propinfo),
4329 MTP_AUDIO_SAMPLERATE_32K);
4330 _prop_add_supp_integer_val(&(prop[i].propinfo),
4331 MTP_AUDIO_SAMPLERATE_CD);
4332 _prop_set_default_integer(&(prop[i].propinfo),
4333 (mtp_uchar *)&default_val);
4334 __append_interdep_prop(ptr_interdep_prop_cfg, &(prop[i]));
4337 /* Created one valid configuration */
4338 ret = _util_add_node(&(interdep_proplist.plist),
4339 (void *)ptr_interdep_prop_cfg);
4342 ERR("List add Fail");
4347 #endif /*MTP_SUPPORT_INTERDEPENDENTPROP*/
4354 mtp_bool _prop_build_supp_props_wmv(void)
4356 static mtp_bool initialized = FALSE;
4357 mtp_wchar buff[3] = { 0 };
4359 mtp_uint32 default_val;
4361 if (initialized == TRUE) {
4362 DBG("already supported list is in there. just return!!");
4365 _util_utf8_to_utf16(buff, sizeof(buff) / WCHAR_SIZ, "");
4367 /*Common properties 1 - 8 */
4368 __build_supported_common_props(&i, &props_list_wmv[i]);
4371 * MTP_OBJ_PROPERTYCODE_WIDTH (9)
4373 __init_obj_prop_desc(&(props_list_wmv[i]),
4374 MTP_OBJ_PROPERTYCODE_WIDTH,
4375 PTP_DATATYPE_UINT32,
4376 PTP_PROPGETSET_GETONLY,
4377 RANGE_FORM, MTP_PROP_GROUPCODE_OBJECT);
4380 _prop_set_range_integer(&(props_list_wmv[i].propinfo),
4381 MTP_MIN_VIDEO_WIDTH, MTP_MAX_VIDEO_WIDTH,
4382 MTP_VIDEO_HEIGHT_WIDTH_INTERVAL);
4383 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4384 (mtp_uchar *)&default_val);
4388 * MTP_OBJ_PROPERTYCODE_HEIGHT (10)
4390 __init_obj_prop_desc(&(props_list_wmv[i]),
4391 MTP_OBJ_PROPERTYCODE_HEIGHT,
4392 PTP_DATATYPE_UINT32,
4393 PTP_PROPGETSET_GETONLY,
4394 RANGE_FORM, MTP_PROP_GROUPCODE_OBJECT);
4397 _prop_set_range_integer(&(props_list_wmv[i].propinfo),
4398 MTP_MIN_VIDEO_HEIGHT, MTP_MAX_VIDEO_HEIGHT,
4399 MTP_VIDEO_HEIGHT_WIDTH_INTERVAL);
4400 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4401 (mtp_uchar *)&default_val);
4406 * MTP_OBJ_PROPERTYCODE_SAMPLERATE (11)
4408 __init_obj_prop_desc(&(props_list_wmv[i]),
4409 MTP_OBJ_PROPERTYCODE_SAMPLERATE,
4410 PTP_DATATYPE_UINT32,
4411 PTP_PROPGETSET_GETONLY,
4412 RANGE_FORM, MTP_PROP_GROUPCODE_OBJECT);
4414 default_val = MTP_AUDIO_SAMPLERATE_8K;
4415 _prop_set_range_integer(&(props_list_wmv[i]).propinfo,
4416 MTP_AUDIO_SAMPLERATE_8K,
4417 MTP_AUDIO_SAMPLERATE_DVD, MTP_AUDIO_SAMPLE_RATE_INTERVAL);
4418 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4419 (mtp_uchar *)&default_val);
4423 * MTP_OBJ_PROPERTYCODE_NUMBEROFCHANNELS (12)
4425 __init_obj_prop_desc(&(props_list_wmv[i]),
4426 MTP_OBJ_PROPERTYCODE_NUMBEROFCHANNELS,
4427 PTP_DATATYPE_UINT16,
4428 PTP_PROPGETSET_GETONLY,
4429 ENUM_FORM, MTP_PROP_GROUPCODE_OBJECT);
4431 default_val = MTP_CHANNELS_MONO;
4432 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4433 MTP_CHANNELS_NOT_USED);
4434 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4436 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4437 MTP_CHANNELS_STEREO);
4438 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4439 (mtp_uchar *)&default_val);
4443 * MTP_OBJ_PROPERTYCODE_AUDIOWAVECODEC (13)
4445 __init_obj_prop_desc(&(props_list_wmv[i]),
4446 MTP_OBJ_PROPERTYCODE_AUDIOWAVECODEC,
4447 PTP_DATATYPE_UINT32,
4448 PTP_PROPGETSET_GETONLY,
4449 ENUM_FORM, MTP_PROP_GROUPCODE_OBJECT);
4451 default_val = MTP_WAVEFORMAT_UNKNOWN;
4452 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4453 MTP_WAVEFORMAT_UNKNOWN);
4454 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4455 MTP_WAVEFORMAT_MPEGLAYER3);
4456 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4457 MTP_WAVEFORMAT_MSAUDIO1);
4458 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4459 MTP_WAVEFORMAT_MSAUDIO2);
4460 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4461 MTP_WAVEFORMAT_PCM);
4462 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4463 MTP_WAVEFORMAT_ADPCM);
4464 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4465 MTP_WAVEFORMAT_MSAUDIO3);
4466 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4467 MTP_WAVEFORMAT_RAW_AAC1);
4468 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4469 MTP_WAVEFORMAT_MPEG_HEAAC);
4470 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4471 (mtp_uchar *)&default_val);
4475 * MTP_OBJ_PROPERTYCODE_AUDIOBITRATE (14)
4477 __init_obj_prop_desc(&(props_list_wmv[i]),
4478 MTP_OBJ_PROPERTYCODE_AUDIOBITRATE,
4479 PTP_DATATYPE_UINT32,
4480 PTP_PROPGETSET_GETONLY,
4481 RANGE_FORM, MTP_PROP_GROUPCODE_OBJECT);
4483 default_val = MTP_AUDIO_BITRATE_UNKNOWN;
4484 _prop_set_range_integer(&(props_list_wmv[i].propinfo),
4485 MTP_AUDIO_BITRATE_UNKNOWN,
4486 MTP_AUDIO_BITRATE_BLUERAY, 1L);
4487 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4488 (mtp_uchar *)&default_val);
4492 * MTP_OBJ_PROPERTYCODE_VIDEOFOURCCCODEC (15)
4494 __init_obj_prop_desc(&(props_list_wmv[i]),
4495 MTP_OBJ_PROPERTYCODE_VIDEOFOURCCCODEC,
4496 PTP_DATATYPE_UINT32,
4497 PTP_PROPGETSET_GETONLY,
4498 ENUM_FORM, MTP_PROP_GROUPCODE_OBJECT);
4500 default_val = MTP_VIDEOFOURCC_MP42;
4501 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4502 MTP_VIDEOFOURCC_UNKNOWN);
4503 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4504 MTP_VIDEOFOURCC_H263);
4505 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4506 MTP_VIDEOFOURCC_H264);
4507 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4508 MTP_VIDEOFOURCC_MP42);
4509 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4510 MTP_VIDEOFOURCC_MP43);
4511 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4512 MTP_VIDEOFOURCC_WMV1);
4513 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4514 MTP_VIDEOFOURCC_WMV2);
4515 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4516 MTP_VIDEOFOURCC_WMV3);
4517 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4518 MTP_VIDEOFOURCC_DIVX);
4519 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4520 MTP_VIDEOFOURCC_XVID);
4521 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4522 MTP_VIDEOFOURCC_M4S2);
4523 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4524 MTP_VIDEOFOURCC_MP4V);
4525 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4526 MTP_VIDEOFOURCC_AVC1);
4527 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4528 MTP_VIDEOFOURCC_h264);
4529 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4530 MTP_VIDEOFOURCC_X264);
4531 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4532 MTP_VIDEOFOURCC_N264);
4533 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4534 (mtp_uchar *)&default_val);
4538 * MTP_OBJ_PROPERTYCODE_VIDEOBITRATE (16)
4540 __init_obj_prop_desc(&(props_list_wmv[i]),
4541 MTP_OBJ_PROPERTYCODE_VIDEOBITRATE,
4542 PTP_DATATYPE_UINT32,
4543 PTP_PROPGETSET_GETONLY,
4544 RANGE_FORM, MTP_PROP_GROUPCODE_OBJECT);
4546 default_val = MTP_MIN_VIDEO_BITRATE;
4547 _prop_set_range_integer(&(props_list_wmv[i].propinfo),
4548 MTP_MIN_VIDEO_BITRATE, MTP_MAX_VIDEO_BITRATE, 1L);
4549 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4550 (mtp_uchar *)&default_val);
4554 * MTP_OBJ_PROPERTYCODE_FRAMESPER1KSECONDS (17)
4556 __init_obj_prop_desc(&(props_list_wmv[i]),
4557 MTP_OBJ_PROPERTYCODE_FRAMESPER1KSECONDS,
4558 PTP_DATATYPE_UINT32,
4559 PTP_PROPGETSET_GETONLY,
4560 RANGE_FORM, MTP_PROP_GROUPCODE_OBJECT);
4562 default_val = MTP_MIN_VIDEO_FPS;
4563 _prop_set_range_integer(&(props_list_wmv[i].propinfo), MTP_MIN_VIDEO_FPS,
4564 MTP_MAX_VIDEO_FPS, 1L);
4565 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4566 (mtp_uchar *)&default_val);
4570 * MTP_OBJ_PROPERTYCODE_DESCRIPTION (18)
4572 __init_obj_prop_desc(&(props_list_wmv[i]),
4573 MTP_OBJ_PROPERTYCODE_DESCRIPTION,
4574 PTP_DATATYPE_AUINT16,
4575 PTP_PROPGETSET_GETONLY,
4577 MTP_PROP_GROUPCODE_GENERAL);
4579 _prop_set_maxlen(&(props_list_wmv[i]), MAX_PTP_STRING_CHARS);
4580 _prop_set_default_array(&(props_list_wmv[i].propinfo), NULL, 0);
4584 * MTP_OBJ_PROPERTYCODE_COPYRIGHTINFO (19)
4586 __init_obj_prop_desc(&(props_list_wmv[i]),
4587 MTP_OBJ_PROPERTYCODE_COPYRIGHTINFO,
4588 PTP_DATATYPE_AUINT16,
4589 PTP_PROPGETSET_GETONLY,
4591 MTP_PROP_GROUPCODE_GENERAL);
4593 _prop_set_maxlen(&(props_list_wmv[i]), MAX_PTP_STRING_CHARS);
4594 _prop_set_default_array(&(props_list_wmv[i].propinfo), NULL, 0);
4598 * MTP_OBJ_PROPERTYCODE_ENCODINGPROFILE (20)
4600 __init_obj_prop_desc(&(props_list_wmv[i]),
4601 MTP_OBJ_PROPERTYCODE_ENCODINGPROFILE,
4602 PTP_DATATYPE_STRING,
4603 PTP_PROPGETSET_GETONLY,
4604 ENUM_FORM, MTP_PROP_GROUPCODE_OBJECT);
4606 _util_utf8_to_utf16(buff, sizeof(buff) / WCHAR_SIZ, "SP");
4607 _prop_add_supp_string_val(&(props_list_wmv[i].propinfo), buff);
4608 _util_utf8_to_utf16(buff, sizeof(buff) / WCHAR_SIZ, "MP");
4609 _prop_add_supp_string_val(&(props_list_wmv[i].propinfo), buff);
4610 _util_utf8_to_utf16(buff, sizeof(buff) / WCHAR_SIZ, "SP");
4611 _prop_set_default_string(&(props_list_wmv[i].propinfo), buff);
4615 * MTP_OBJ_PROPERTYCODE_METAGENRE (21)
4617 __init_obj_prop_desc(&(props_list_wmv[i]),
4618 MTP_OBJ_PROPERTYCODE_METAGENRE,
4619 PTP_DATATYPE_UINT16,
4620 PTP_PROPGETSET_GETONLY,
4621 ENUM_FORM, MTP_PROP_GROUPCODE_OBJECT);
4623 default_val = MTP_METAGENRE_NOT_USED;
4624 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4625 MTP_METAGENRE_NOT_USED);
4626 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4627 MTP_METAGENRE_GENERIC_MUSIC_AUDIO_FILE);
4628 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4629 MTP_METAGENRE_GENERIC_NONMUSIC_AUDIO_FILE);
4630 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4631 MTP_METAGENRE_SPOKEN_WORD_AUDIO_BOOK_FILES);
4632 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4633 MTP_METAGENRE_SPOKEN_WORD_NONAUDIO_BOOK_FILES);
4634 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4635 MTP_METAGENRE_SPOKEN_WORD_NEWS);
4636 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4637 MTP_METAGENRE_GENERIC_VIDEO_FILE);
4638 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4639 MTP_METAGENRE_NEWS_VIDEO_FILE);
4640 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4641 MTP_METAGENRE_MUSIC_VIDEO_FILE);
4642 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4643 MTP_METAGENRE_HOME_VIDEO_FILE);
4644 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4645 MTP_METAGENRE_FEATURE_FILM_VIDEO_FILE);
4646 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4647 MTP_METAGENRE_TV_SHOW_VIDEO_FILE);
4648 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4649 MTP_METAGENRE_TRAINING_VIDEO_FILE);
4650 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4651 MTP_METAGENRE_PHOTO_MONTAGE_VIDEO_FILE);
4652 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4653 MTP_METAGENRE_GENERIC_NONAUDIO_NONVIDEO_FILE);
4654 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4655 MTP_METAGENRE_AUDIO_MEDIA_CAST_FILE);
4656 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4657 MTP_METAGENRE_VIDEO_MEDIA_CAST_FILE);
4658 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4659 (mtp_uchar *)&default_val);
4663 * MTP_OBJ_PROPERTYCODE_SCANTYPE (22)
4665 __init_obj_prop_desc(&(props_list_wmv[i]),
4666 MTP_OBJ_PROPERTYCODE_SCANTYPE,
4667 PTP_DATATYPE_UINT16,
4668 PTP_PROPGETSET_GETONLY,
4669 ENUM_FORM, MTP_PROP_GROUPCODE_OBJECT);
4671 default_val = MTP_SCANTYPE_NOT_USED;
4672 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4673 MTP_SCANTYPE_NOT_USED);
4674 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4675 MTP_SCANTYPE_PROGESSIVE);
4676 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4677 MTP_SCANTYPE_FIELDINTERLEAVEDUPPERFIRST);
4678 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4679 MTP_SCANTYPE_FIELDINTERLEAVEDLOWERFIRST);
4680 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4681 MTP_SCANTYPE_FIELDSINGLEUPPERFIRST);
4682 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4683 MTP_SCANTYPE_FIELDSINGLELOWERFIRST);
4684 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4685 MTP_SCANTYPE_MIXEDINTERLACE);
4686 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4687 MTP_SCANTYPE_MIXEDINTERLACEANDPROGRESSIVE);
4688 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4689 (mtp_uchar *)&default_val);
4691 #ifdef MTP_SUPPORT_PROPERTY_SAMPLE
4692 __build_supported_sample_props(&i, &props_list_wmv[i]);
4693 #endif /*MTP_SUPPORT_PROPERTY_SAMPLE*/
4700 mtp_bool _prop_build_supp_props_album(void)
4702 static mtp_bool initialized = FALSE;
4704 mtp_uint32 default_val;
4706 if (initialized == TRUE) {
4707 DBG("already supported list is in there. just return!!");
4712 * MTP_OBJ_PROPERTYCODE_WIDTH (1)
4714 __init_obj_prop_desc(&(props_list_album[i]),
4715 MTP_OBJ_PROPERTYCODE_WIDTH,
4716 PTP_DATATYPE_UINT32,
4717 PTP_PROPGETSET_GETONLY,
4718 RANGE_FORM, MTP_PROP_GROUPCODE_OBJECT);
4721 _prop_set_range_integer(&(props_list_album[i].propinfo), 0,
4722 MTP_MAX_IMG_WIDTH, 1L);
4723 _prop_set_default_integer(&(props_list_album[i].propinfo),
4724 (mtp_uchar *)&default_val);
4728 * MTP_OBJ_PROPERTYCODE_HEIGHT (2)
4730 __init_obj_prop_desc(&(props_list_album[i]),
4731 MTP_OBJ_PROPERTYCODE_HEIGHT,
4732 PTP_DATATYPE_UINT32,
4733 PTP_PROPGETSET_GETONLY,
4734 RANGE_FORM, MTP_PROP_GROUPCODE_OBJECT);
4737 _prop_set_range_integer(&(props_list_album[i].propinfo), 0,
4738 MTP_MAX_IMG_HEIGHT, 1L);
4739 _prop_set_default_integer(&(props_list_album[i].propinfo),
4740 (mtp_uchar *)&default_val);
4743 * SAMPLE PROPERTIES (3-8)
4745 #ifdef MTP_SUPPORT_PROPERTY_SAMPLE
4747 __build_supported_sample_props(&i, &props_list_album[i]);
4748 #endif /*MTP_SUPPORT_PROPERTY_SAMPLE*/
4755 void _prop_destroy_supp_obj_props(void)
4758 int num_default_obj_prps = 0;
4760 for (i = 0; i < NUM_OBJECT_PROP_DESC_MP3; i++)
4761 __destroy_obj_prop_desc(&(props_list_mp3[i]));
4763 for (i = 0; i < NUM_OBJECT_PROP_DESC_WMA; i++)
4764 __destroy_obj_prop_desc(&(props_list_wma[i]));
4766 for (i = 0; i < NUM_OBJECT_PROP_DESC_WMV; i++)
4767 __destroy_obj_prop_desc(&(props_list_wmv[i]));
4769 for (i = 0; i < NUM_OBJECT_PROP_DESC_ALBUM; i++)
4770 __destroy_obj_prop_desc(&(props_list_album[i]));
4772 if (_get_oma_drm_status() == TRUE)
4773 num_default_obj_prps = NUM_OBJECT_PROP_DESC_DEFAULT;
4775 num_default_obj_prps = NUM_OBJECT_PROP_DESC_DEFAULT - 1;
4777 for (i = 0; i < num_default_obj_prps; i++)
4778 __destroy_obj_prop_desc(&(props_list_default[i]));
4783 #ifdef MTP_SUPPORT_INTERDEPENDENTPROP
4784 static mtp_bool __append_interdep_prop(interdep_prop_config_t *prop_config,
4785 obj_prop_desc_t *prop)
4789 ret = _util_add_node(&(prop_config->propdesc_list),
4792 ERR("list add Fail");
4799 #endif /* MTP_SUPPORT_INTERDEPENDENTPROP */
4801 mtp_uint32 _prop_get_size_interdep_prop(interdep_prop_config_t *prop_config)
4803 obj_prop_desc_t *prop = NULL;
4806 mtp_uint32 size = sizeof(mtp_uint32);
4808 node = prop_config->propdesc_list.start;
4809 for (ii = 0; ii < prop_config->propdesc_list.nnodes; ii++) {
4812 size += _prop_size_obj_prop_desc(prop);
4817 mtp_uint32 _prop_pack_interdep_prop(interdep_prop_config_t *prop_config,
4818 mtp_uchar *buf, mtp_uint32 size)
4820 mtp_uchar *temp = buf;
4821 obj_prop_desc_t *prop = NULL;
4823 mtp_uint32 ele_size = 0;
4826 if (!buf || size < _prop_get_size_interdep_prop(prop_config))
4829 *(mtp_uint32 *) buf = prop_config->propdesc_list.nnodes;
4830 #ifdef __BIG_ENDIAN__
4831 _util_conv_byte_order(buf, sizeof(mtp_uint32));
4832 #endif /* __BIG_ENDIAN__ */
4833 temp += sizeof(mtp_uint32);
4835 node = prop_config->propdesc_list.start;
4836 for (ii = 0; ii < prop_config->propdesc_list.nnodes; ii++) {
4840 ele_size = _prop_size_obj_prop_desc(prop);
4841 _prop_pack_obj_prop_desc(prop, temp, ele_size);
4846 return (mtp_uint32)(temp - buf);
4849 static mtp_uint32 __count_interdep_proplist(obj_interdep_proplist_t *config_list,
4850 mtp_uint32 format_code)
4852 mtp_uint32 count = 0;
4853 interdep_prop_config_t *prop_config = NULL;
4857 node = config_list->plist.start;
4859 for (ii = 0; ii < config_list->plist.nnodes; ii++) {
4860 prop_config = node->value;
4861 if ((prop_config->format_code == format_code) ||
4862 (prop_config->format_code == PTP_FORMATCODE_NOTUSED)) {
4869 mtp_uint32 _prop_get_size_interdep_proplist(obj_interdep_proplist_t *config_list,
4870 mtp_uint32 format_code)
4872 mtp_uint32 size = sizeof(mtp_uint32);
4873 interdep_prop_config_t *prop_config = NULL;
4877 node = config_list->plist.start;
4879 for (ii = 0; ii < config_list->plist.nnodes; ii++) {
4880 prop_config = node->value;
4881 if ((prop_config->format_code == format_code) ||
4882 (prop_config->format_code == PTP_FORMATCODE_NOTUSED)) {
4884 size += _prop_get_size_interdep_prop(prop_config);
4890 mtp_uint32 _prop_pack_interdep_proplist(obj_interdep_proplist_t *config_list,
4891 mtp_uint32 format_code, mtp_uchar *buf, mtp_uint32 size)
4893 mtp_uchar *temp = buf;
4894 interdep_prop_config_t *prop_config = NULL;
4897 mtp_uint32 ele_size = 0;
4900 size < _prop_get_size_interdep_proplist(config_list, format_code)) {
4904 *(mtp_uint32 *)buf = __count_interdep_proplist(config_list,
4906 #ifdef __BIG_ENDIAN__
4907 _util_conv_byte_order(buf, sizeof(mtp_uint32));
4908 #endif /* __BIG_ENDIAN__ */
4909 temp += sizeof(mtp_uint32);
4911 node = config_list->plist.start;
4913 for (ii = 0; ii < config_list->plist.nnodes; ii++) {
4915 prop_config = node->value;
4916 if ((prop_config->format_code == format_code) ||
4917 (prop_config->format_code == PTP_FORMATCODE_NOTUSED)) {
4919 ele_size = _prop_get_size_interdep_prop(prop_config);
4920 _prop_pack_interdep_prop(prop_config, temp, ele_size);
4925 return (mtp_uint32)(temp - buf);
4928 mtp_bool _get_oma_drm_status(void)
4930 #ifdef MTP_SUPPORT_OMADRM_EXTENSION
4932 #else /* MTP_SUPPORT_OMADRM_EXTENSION */
4934 #endif /* MTP_SUPPORT_OMADRM_EXTENSION */