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));
730 if (parray != NULL) {
731 _prop_init_ptparray(parray, type);
737 mtp_uint32 _prop_get_size_ptparray(ptp_array_t *parray)
741 if (parray == NULL) {
742 ERR("ptp_array_t is NULL");
746 size = __get_ptp_array_elem_size(parray->type);
750 return (sizeof(mtp_uint32) + (size *parray->num_ele));
753 mtp_uint32 _prop_get_size_ptparray_without_elemsize(ptp_array_t *parray)
757 size = __get_ptp_array_elem_size(parray->type);
761 return (size * parray->num_ele);
764 mtp_bool _prop_grow_ptparray(ptp_array_t *parray, mtp_uint32 new_size)
768 size = __get_ptp_array_elem_size(parray->type);
772 if (parray->arr_size == 0)
773 _prop_init_ptparray(parray, parray->type);
775 if (new_size < parray->arr_size)
778 parray->array_entry =
779 g_realloc(parray->array_entry, size * new_size);
780 if (parray->array_entry == NULL) {
781 parray->arr_size = 0;
784 parray->arr_size = new_size;
789 mtp_int32 _prop_find_ele_ptparray(ptp_array_t *parray, mtp_uint32 element)
791 mtp_uchar *ptr8 = NULL;
792 mtp_uint16 *ptr16 = NULL;
793 mtp_uint32 *ptr32 = NULL;
796 retv_if(parray->array_entry == NULL, ELEMENT_NOT_FOUND);
798 switch (parray->type) {
800 ptr8 = parray->array_entry;
801 for (ii = 0; ii < parray->num_ele; ii++) {
802 if (ptr8[ii] == (mtp_uchar) element) {
809 ptr16 = parray->array_entry;
810 for (ii = 0; ii < parray->num_ele; ii++) {
811 if (ptr16[ii] == (mtp_uint16) element) {
819 ptr32 = parray->array_entry;
820 for (ii = 0; ii < parray->num_ele; ii++) {
821 if (ptr32[ii] == (mtp_uint32)element) {
830 return ELEMENT_NOT_FOUND;
833 mtp_bool _prop_get_ele_ptparray(ptp_array_t *parray, mtp_uint32 index, void *ele)
835 mtp_uchar *ptr8 = NULL;
836 mtp_uint16 *ptr16 = NULL;
837 mtp_uint32 *ptr32 = NULL;
839 retv_if(parray->array_entry == NULL, FALSE);
841 if (index >= parray->num_ele)
844 switch (parray->type) {
846 ptr8 = parray->array_entry;
847 *((mtp_uchar *)ele) = ptr8[index];
850 ptr16 = parray->array_entry;
851 *((mtp_uint16 *)ele) = ptr16[index];
856 ptr32 = parray->array_entry;
857 *((mtp_uint32 *)ele) = ptr32[index];
865 mtp_bool _prop_append_ele_ptparray(ptp_array_t *parray, mtp_uint32 element)
868 mtp_uchar *ptr8 = NULL;
869 mtp_uint16 *ptr16 = NULL;
870 mtp_uint32 *ptr32 = NULL;
872 if (parray->num_ele >= parray->arr_size) {
873 ERR("parray->num_ele [%d] is bigger than parray->arr_size [%d]\n",
874 parray->num_ele, parray->arr_size);
875 if (FALSE == _prop_grow_ptparray(parray,
876 ((parray->arr_size * 3) >> 1) + 2))
880 switch (parray->type) {
882 ptr8 = parray->array_entry;
883 ptr8[parray->num_ele++] = (mtp_uchar)element;
887 ptr16 = parray->array_entry;
888 ptr16[parray->num_ele++] = (mtp_uint16) element;
893 ptr32 = parray->array_entry;
894 ptr32[parray->num_ele++] = (mtp_uint32)element;
904 mtp_bool _prop_append_ele128_ptparray(ptp_array_t *parray, mtp_uint64 *element)
906 mtp_uchar *ptr = NULL;
907 mtp_bool ret = FALSE;
908 if (parray->num_ele >= parray->arr_size) {
909 if (FALSE == _prop_grow_ptparray(parray,
910 ((parray->arr_size * 3) >> 1) + 2))
914 switch (parray->type) {
916 ptr = parray->array_entry;
917 memcpy(&(ptr[(parray->num_ele * 16)]), element,
918 sizeof(mtp_uint64) * 2);
930 mtp_bool _prop_copy_ptparray(ptp_array_t *dst, ptp_array_t *src)
932 mtp_uchar *ptr8src = NULL;
933 mtp_uint16 *ptr16src = NULL;
934 mtp_uint32 *ptr32src = NULL;
937 dst->type = src->type;
941 ptr8src = src->array_entry;
942 for (ii = 0; ii < src->num_ele; ii++)
943 _prop_append_ele_ptparray(dst, ptr8src[ii]);
947 ptr16src = src->array_entry;
948 for (ii = 0; ii < src->num_ele; ii++)
949 _prop_append_ele_ptparray(dst, ptr16src[ii]);
954 ptr32src = src->array_entry;
955 for (ii = 0; ii < src->num_ele; ii++)
956 _prop_append_ele_ptparray(dst, ptr32src[ii]);
965 mtp_uint32 _prop_pack_ptparray(ptp_array_t *parray, mtp_uchar *buf,
968 if (parray == NULL || buf == NULL) {
969 ERR("pArray or buf is NULL");
975 size = __get_ptp_array_elem_size(parray->type);
979 if ((buf == NULL) || (bufsize < (sizeof(mtp_uint32) +
980 parray->num_ele * size)))
983 memcpy(buf, &(parray->num_ele), sizeof(mtp_uint32));
984 #ifdef __BIG_ENDIAN__
985 _util_conv_byte_order(buf, sizeof(mtp_uint32));
986 #endif /* __BIG_ENDIAN__ */
988 if (parray->num_ele != 0) {
989 #ifdef __BIG_ENDIAN__
991 mtp_uchar *temp = buf + sizeof(mtp_uint32);
992 mtp_uchar *ptr_entry = parray->array_entry;
994 for (ii = 0; ii < parray->num_ele; ii++) {
995 memcpy(temp, ptr_entry, size);
996 _util_conv_byte_order(temp, size);
1000 #else /* __BIG_ENDIAN__ */
1001 memcpy(buf + sizeof(mtp_uint32), parray->array_entry,
1002 parray->num_ele * size);
1003 #endif /* __BIG_ENDIAN__ */
1005 return (sizeof(mtp_uint32) + parray->num_ele * size);
1008 mtp_uint32 _prop_pack_ptparray_without_elemsize(ptp_array_t *parray,
1009 mtp_uchar *buf, mtp_uint32 bufsize)
1011 mtp_uint16 size = 1;
1012 #ifdef __BIG_ENDIAN__
1015 #endif /* __BIG_ENDIAN__ */
1017 size = __get_ptp_array_elem_size(parray->type);
1021 if ((buf == NULL) || (bufsize < (parray->num_ele * size)))
1024 if (parray->num_ele != 0)
1025 memcpy(buf, parray->array_entry, parray->num_ele * size);
1027 #ifdef __BIG_ENDIAN__
1028 /* Swap all the elements */
1030 for (ii = 0; ii < parray->num_ele; ii++) {
1031 _util_conv_byte_order(temp, size);
1034 #endif /* __BIG_ENDIAN__ */
1036 return (parray->num_ele * size);
1039 mtp_bool _prop_rem_elem_ptparray(ptp_array_t *parray, mtp_uint32 element)
1041 mtp_uchar *ptr8 = NULL;
1042 mtp_uint16 *ptr16 = NULL;
1043 mtp_uint32 *ptr32 = NULL;
1046 ii = _prop_find_ele_ptparray(parray, element);
1048 if (ii == ELEMENT_NOT_FOUND)
1051 switch (parray->type) {
1053 ptr8 = parray->array_entry;
1054 for (; ii < (parray->num_ele - 1); ii++)
1055 ptr8[ii] = ptr8[ii + 1];
1059 ptr16 = parray->array_entry;
1060 for (; ii < (parray->num_ele - 1); ii++)
1061 ptr16[ii] = ptr16[ii + 1];
1065 ptr32 = parray->array_entry;
1066 for (; ii < (parray->num_ele - 1); ii++)
1067 ptr32[ii] = ptr32[ii + 1];
1071 ptr32 = parray->array_entry;
1072 for (; ii < (parray->num_ele - 1); ii++)
1073 ptr32[ii] = ptr32[ii + 1];
1086 void _prop_deinit_ptparray(ptp_array_t *parray)
1088 parray->num_ele = 0;
1089 parray->arr_size = 0;
1090 if (parray->array_entry) {
1091 g_free(parray->array_entry);
1093 parray->array_entry = NULL;
1097 void _prop_destroy_ptparray(ptp_array_t *parray)
1102 if (parray->array_entry != NULL) {
1103 g_free(parray->array_entry);
1105 parray->arr_size = 0;
1106 parray->num_ele = 0;
1111 mtp_uint16 __get_ptp_array_elem_size(data_type_t type)
1113 mtp_uint16 size = 0;
1137 /* PtpString Functions */
1138 #ifndef MTP_USE_VARIABLE_PTP_STRING_MALLOC
1139 static ptp_string_t *__alloc_ptpstring(void)
1141 ptp_string_t *pstring = NULL;
1143 pstring = (ptp_string_t *)g_malloc(sizeof(ptp_string_t));
1144 if (pstring != NULL) {
1145 _prop_init_ptpstring(pstring);
1150 #else /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
1151 static ptp_string_t *__alloc_ptpstring(mtp_uint32 size)
1153 ptp_string_t *pstring = NULL;
1154 mtp_int32 size_tmp = 0;
1155 mtp_int32 alloc_size = 0;
1157 size_tmp = sizeof(wchar_t) * size + sizeof(wchar_t) * 2;
1158 alloc_size = ((size_tmp >> 5) + 1) << 5; /* multiple of 32 */
1160 pstring = (ptp_string_t *)g_malloc(alloc_size); /* for margin */
1161 if (pstring != NULL) {
1162 _prop_init_ptpstring(pstring);
1167 #endif /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
1169 void _prop_init_ptpstring(ptp_string_t *pstring)
1171 pstring->num_chars = 0;
1175 static void __init_ptptimestring(ptp_time_string_t *pstring)
1177 pstring->num_chars = 0;
1180 void _prop_copy_char_to_ptpstring(ptp_string_t *pstring, void *str,
1183 if (pstring == NULL)
1186 mtp_char *pchar = NULL;
1187 mtp_wchar *pwchar = NULL;
1190 pchar = (mtp_char *)str;
1191 pwchar = (mtp_wchar *)str;
1194 pstring->num_chars = 0;
1198 if (cmode == CHAR_TYPE) {
1199 if (pchar[0] == 0) {
1200 pstring->num_chars = 0;
1203 for (i = 0; i < MAX_PTP_STRING_CHARS && pchar[i]; i++) {
1204 pstring->str[i] = (mtp_wchar)pchar[i];
1206 } else if (cmode == WCHAR_TYPE) {
1207 if (pwchar[0] == 0) {
1208 pstring->num_chars = 0;
1211 for (i = 0; i < MAX_PTP_STRING_CHARS && pwchar[i]; i++) {
1212 pstring->str[i] = pwchar[i];
1215 ERR("Unknown character mode : %d\n", cmode);
1216 pstring->num_chars = 0;
1220 if (i == MAX_PTP_STRING_CHARS)
1221 pstring->num_chars = i;
1223 pstring->num_chars = i + 1;
1225 pstring->str[pstring->num_chars - 1] = (mtp_wchar)0;
1230 void _prop_copy_time_to_ptptimestring(ptp_time_string_t *pstring,
1231 system_time_t *sys_time)
1233 char time[17] = { 0 };
1235 if (sys_time == NULL) {
1236 __init_ptptimestring(pstring);
1238 #if defined(NEED_TO_PORT)
1239 _util_wchar_swprintf(pstring->str, sizeof(pstring->str) / WCHAR_SIZ,
1240 "%04d%02d%02dT%02d%02d%02d.%01d",
1241 sys_time->year, sys_time->month,
1242 sys_time->day, sys_time->hour,
1243 sys_time->minute, sys_time->second,
1244 (sys_time->millisecond) / 100);
1246 g_snprintf(time, sizeof(time), "%04d%02d%02dT%02d%02d%02d.%01d",
1247 sys_time->year, sys_time->month, sys_time->day,
1248 sys_time->hour, sys_time->minute,
1249 sys_time->second, (sys_time->millisecond) / 100);
1251 _util_utf8_to_utf16(pstring->str, sizeof(pstring->str) / WCHAR_SIZ, time);
1253 pstring->num_chars = 17;
1254 pstring->str[17] = '\0';
1259 void _prop_copy_ptpstring(ptp_string_t *dst, ptp_string_t *src)
1263 dst->num_chars = src->num_chars;
1264 for (ii = 0; ii < src->num_chars; ii++) {
1265 dst->str[ii] = src->str[ii];
1270 void _prop_copy_ptptimestring(ptp_time_string_t *dst, ptp_time_string_t *src)
1274 dst->num_chars = src->num_chars;
1275 for (ii = 0; ii < src->num_chars; ii++) {
1276 dst->str[ii] = src->str[ii];
1281 mtp_bool _prop_is_equal_ptpstring(ptp_string_t *dst, ptp_string_t *src)
1285 if (dst->num_chars != src->num_chars)
1288 for (ii = 0; ii < dst->num_chars; ii++) {
1289 if (dst->str[ii] != src->str[ii])
1295 mtp_uint32 _prop_size_ptpstring(ptp_string_t *pstring)
1297 if (pstring == NULL)
1300 return (pstring->num_chars * sizeof(mtp_wchar) + 1);
1303 mtp_uint32 _prop_size_ptptimestring(ptp_time_string_t *pstring)
1305 if (pstring == NULL)
1308 return (pstring->num_chars * sizeof(mtp_wchar) + 1);
1311 mtp_uint32 _prop_pack_ptpstring(ptp_string_t *pstring, mtp_uchar *buf,
1314 mtp_uint32 bytes_written = 0;
1316 mtp_uchar *pchar = NULL;
1317 #ifdef __BIG_ENDIAN__
1318 mtp_wchar conv_str[MAX_PTP_STRING_CHARS];
1319 #endif /* __BIG_ENDIAN__ */
1321 if ((buf == NULL) || (pstring == NULL) || (size == 0) ||
1322 (size < _prop_size_ptpstring(pstring))) {
1323 return bytes_written;
1326 if (pstring->num_chars == 0) {
1330 #ifdef __BIG_ENDIAN__
1331 memcpy(conv_str, pstring->str,
1332 pstring->num_chars * sizeof(mtp_wchar));
1333 _util_conv_byte_orderForWString(conv_str, pstring->num_chars);
1334 pchar = (mtp_uchar *) conv_str;
1335 #else /* __BIG_ENDIAN__ */
1336 pchar = (mtp_uchar *) pstring->str;
1337 #endif /* __BIG_ENDIAN__ */
1338 buf[0] = pstring->num_chars;
1340 bytes_written = _prop_size_ptpstring(pstring);
1341 for (ii = 0; ii < (bytes_written - 1); ii++) {
1342 buf[ii + 1] = pchar[ii];
1345 return bytes_written;
1348 mtp_uint32 _prop_pack_ptptimestring(ptp_time_string_t *pstring, mtp_uchar *buf,
1351 mtp_uint32 bytes_written = 0;
1352 mtp_uchar *pchar = NULL;
1353 #ifdef __BIG_ENDIAN__
1354 mtp_wchar conv_str[MAX_PTP_STRING_CHARS];
1355 #endif /* __BIG_ENDIAN__ */
1357 if ((buf == NULL) || (pstring == NULL) || (size == 0) ||
1358 (size < _prop_size_ptptimestring(pstring))) {
1359 return bytes_written;
1362 if (pstring->num_chars == 0) {
1366 #ifdef __BIG_ENDIAN__
1367 memcpy(conv_str, pstring->str,
1368 pstring->num_chars * sizeof(mtp_wchar));
1369 _util_conv_byte_order_wstring(conv_str, pstring->num_chars);
1370 pchar = (mtp_uchar *)conv_str;
1371 #else /* __BIG_ENDIAN__ */
1372 pchar = (mtp_uchar *)pstring->str;
1373 #endif /* __BIG_ENDIAN__ */
1374 buf[0] = pstring->num_chars;
1376 bytes_written = _prop_size_ptptimestring(pstring);
1378 memcpy(&buf[1], pchar, bytes_written - 1);
1381 return bytes_written;
1384 mtp_uint32 _prop_parse_rawstring(ptp_string_t *pstring, mtp_uchar *buf,
1394 pstring->num_chars = 0;
1397 pstring->num_chars = buf[0];
1398 ii = (mtp_uint16) ((size - 1) / sizeof(mtp_wchar));
1399 if (pstring->num_chars > ii) {
1400 pstring->num_chars = (mtp_uchar)ii;
1403 for (ii = 1; ii <= pstring->num_chars; ii++) {
1404 #ifdef __BIG_ENDIAN__
1405 pstring->str[ii - 1] =
1406 buf[2 * ii] | (buf[2 * ii - 1] << 8);
1407 #else /* __BIG_ENDIAN__ */
1408 pstring->str[ii - 1] =
1409 buf[2 * ii - 1] | (buf[2 * ii] << 8);
1410 #endif /* __BIG_ENDIAN__ */
1412 pstring->str[pstring->num_chars - 1] = (mtp_wchar) 0;
1413 return _prop_size_ptpstring(pstring);
1417 void _prop_destroy_ptpstring(ptp_string_t *pstring)
1419 if (pstring != NULL) {
1425 mtp_bool _prop_is_valid_integer(prop_info_t *prop_info, mtp_uint64 value)
1427 if ((prop_info->data_type & PTP_DATATYPE_VALUEMASK) !=
1428 PTP_DATATYPE_VALUE) {
1432 if (prop_info->form_flag == RANGE_FORM) {
1433 if ((value >= prop_info->range.min_val) &&
1434 (value <= prop_info->range.max_val)) {
1440 } else if (prop_info->form_flag == ENUM_FORM) {
1441 slist_node_t *node = prop_info->supp_value_list.start;
1443 for (ii = 0; ii < prop_info->supp_value_list.nnodes;
1444 ii++, node = node->link) {
1445 if (value == (mtp_uint32) node->value) {
1450 /* if it hits here, must be an invalid value */
1452 } else if (prop_info->form_flag == NONE) {
1453 /* No restrictions */
1457 /* shouldn't be here */
1461 mtp_bool _prop_is_valid_string(prop_info_t *prop_info, ptp_string_t *pstring)
1463 if ((prop_info->data_type != PTP_DATATYPE_STRING) || (pstring == NULL)) {
1467 if (prop_info->form_flag == ENUM_FORM)
1469 slist_node_t *node = NULL;
1471 ptp_string_t *ele_str = NULL;
1473 node = prop_info->supp_value_list.start;
1474 for (ii = 0; ii < prop_info->supp_value_list.nnodes;
1475 ii++, node = node->link) {
1476 ele_str = (ptp_string_t *) node->value;
1477 if (ele_str != NULL) {
1478 if (_prop_is_equal_ptpstring(pstring, ele_str)) {
1479 /* value found in the list of supported values */
1484 /* if it hits here, must be an invalid value */
1486 } else if (prop_info->form_flag == NONE) {
1487 /* No restrictions */
1489 } else if (prop_info->form_flag == DATE_TIME_FORM) {
1490 mtp_wchar *date_time = pstring->str;
1491 if ((date_time[8] != L'T') && (pstring->num_chars > 9)) {
1492 ERR("invalid data time format");
1496 } else if (prop_info->form_flag == REGULAR_EXPRESSION_FORM) {
1503 mtp_bool _prop_set_default_string(prop_info_t *prop_info, mtp_wchar *val)
1505 if (prop_info->data_type == PTP_DATATYPE_STRING) {
1506 _prop_destroy_ptpstring(prop_info->default_val.str);
1507 #ifndef MTP_USE_VARIABLE_PTP_STRING_MALLOC
1508 prop_info->default_val.str = __alloc_ptpstring();
1509 #else /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
1510 prop_info->default_val.str = __alloc_ptpstring(_util_wchar_len(val));
1511 #endif /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
1512 if (NULL == prop_info->default_val.str)
1515 _prop_copy_char_to_ptpstring(prop_info->default_val.str,
1524 mtp_bool _prop_set_default_integer(prop_info_t *prop_info, mtp_uchar *value)
1526 if ((prop_info->data_type & PTP_DATATYPE_VALUEMASK) ==
1527 PTP_DATATYPE_VALUE) {
1528 memcpy(prop_info->default_val.integer, value,
1529 prop_info->dts_size);
1536 mtp_bool _prop_set_default_array(prop_info_t *prop_info, mtp_uchar *parray,
1539 /* Allocate memory for the PTP array */
1540 if ((prop_info->data_type == PTP_DATATYPE_AUINT8) ||
1541 (prop_info->data_type == PTP_DATATYPE_AINT8))
1542 prop_info->default_val.array = _prop_alloc_ptparray(UINT8_TYPE);
1543 else if ((prop_info->data_type == PTP_DATATYPE_AUINT16) ||
1544 (prop_info->data_type == PTP_DATATYPE_AINT16))
1545 prop_info->default_val.array = _prop_alloc_ptparray(UINT16_TYPE);
1546 else if ((prop_info->data_type == PTP_DATATYPE_AUINT32) ||
1547 (prop_info->data_type == PTP_DATATYPE_AINT32))
1548 prop_info->default_val.array = _prop_alloc_ptparray(UINT32_TYPE);
1552 if (prop_info->default_val.array == NULL)
1555 /* Copies the data into the PTP array */
1556 if ((prop_info->default_val.array != NULL) && (num_ele != 0))
1558 mtp_uchar *ptr8 = NULL;
1559 mtp_uint16 *ptr16 = NULL;
1560 mtp_uint32 *ptr32 = NULL;
1563 _prop_grow_ptparray(prop_info->default_val.array, num_ele);
1565 if ((prop_info->data_type == PTP_DATATYPE_AUINT8) ||
1566 (prop_info->data_type == PTP_DATATYPE_AINT8))
1568 ptr8 = (mtp_uchar *) parray;
1569 for (ii = 0; ii < num_ele; ii++)
1570 _prop_append_ele_ptparray(prop_info->default_val.array,
1573 } else if ((prop_info->data_type == PTP_DATATYPE_AUINT16) ||
1574 (prop_info->data_type == PTP_DATATYPE_AINT16)) {
1576 ptr16 = (mtp_uint16 *) parray;
1577 for (ii = 0; ii < num_ele; ii++)
1578 _prop_append_ele_ptparray(prop_info->default_val.array,
1581 } else if ((prop_info->data_type == PTP_DATATYPE_AUINT32) ||
1582 (prop_info->data_type == PTP_DATATYPE_AINT32)) {
1584 ptr32 = (mtp_uint32 *)parray;
1585 for (ii = 0; ii < num_ele; ii++)
1586 _prop_append_ele_ptparray(prop_info->default_val.array,
1594 mtp_bool _prop_set_current_integer(device_prop_desc_t *prop, mtp_uint32 val)
1596 if (_prop_is_valid_integer(&(prop->propinfo), val)) {
1600 ptr = (mtp_uchar *) &val;
1602 for (ii = 0; ii < sizeof(mtp_uint32); ii++) {
1603 prop->current_val.integer[ii] = ptr[ii];
1608 /* setting invalid value */
1613 mtp_bool _prop_set_current_string(device_prop_desc_t *prop, ptp_string_t *str)
1615 if (_prop_is_valid_string(&(prop->propinfo), str))
1617 _prop_destroy_ptpstring(prop->current_val.str);
1618 #ifndef MTP_USE_VARIABLE_PTP_STRING_MALLOC
1619 prop->current_val.str = __alloc_ptpstring();
1620 #else /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
1621 prop->current_val.str = __alloc_ptpstring(str->num_chars);
1622 #endif /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
1623 if (prop->current_val.str != NULL) {
1624 _prop_copy_ptpstring(prop->current_val.str, str);
1628 _prop_destroy_ptpstring(prop->current_val.str);
1632 /* setting invalid value */
1637 mtp_bool _prop_set_current_array(device_prop_desc_t *prop, mtp_uchar *arr)
1639 mtp_uint32 num_ele = 0;
1640 mtp_uchar *pval = NULL;
1641 memcpy(&num_ele, arr, sizeof(mtp_uint32));
1642 pval = arr + sizeof(mtp_uint32);
1644 #ifdef __BIG_ENDIAN__
1645 /* Byte swap the number of elements */
1646 _util_conv_byte_order(&num_ele, sizeof(mtp_uint32));
1647 #endif /* __BIG_ENDIAN__ */
1649 /* Allocate memory for the PTP array */
1650 if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT8) ||
1651 (prop->propinfo.data_type == PTP_DATATYPE_AINT8)) {
1652 _prop_destroy_ptparray(prop->current_val.array);
1653 prop->current_val.array = _prop_alloc_ptparray(UINT8_TYPE);
1655 } else if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT16) ||
1656 (prop->propinfo.data_type == PTP_DATATYPE_AINT16)) {
1658 _prop_destroy_ptparray(prop->current_val.array);
1659 prop->current_val.array = _prop_alloc_ptparray(UINT16_TYPE);
1661 } else if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT32) ||
1662 (prop->propinfo.data_type == PTP_DATATYPE_AINT32)) {
1664 _prop_destroy_ptparray(prop->current_val.array);
1665 prop->current_val.array = _prop_alloc_ptparray(UINT32_TYPE);
1670 /* Copies the data into the PTP array */
1671 if ((prop->current_val.array != NULL) && (num_ele != 0)) {
1672 mtp_uchar *ptr8 = NULL;
1673 mtp_uint16 *ptr16 = NULL;
1674 mtp_uint32 *ptr32 = NULL;
1676 #ifdef __BIG_ENDIAN__
1677 /* Some temporary variables for swapping the bytes */
1680 #endif /* __BIG_ENDIAN__ */
1682 _prop_grow_ptparray(prop->current_val.array, num_ele);
1684 if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT8) ||
1685 (prop->propinfo.data_type == PTP_DATATYPE_AINT8)) {
1687 ptr8 = (mtp_uchar *) pval;
1688 for (ii = 0; ii < num_ele; ii++)
1689 _prop_append_ele_ptparray(prop->current_val.array,
1692 } else if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT16) ||
1693 (prop->propinfo.data_type == PTP_DATATYPE_AINT16)) {
1695 ptr16 = (mtp_uint16 *) pval;
1696 for (ii = 0; ii < num_ele; ii++) {
1697 #ifdef __BIG_ENDIAN__
1699 _util_conv_byte_order(&swap16, sizeof(mtp_uint16));
1700 _prop_append_ele_ptparray(prop->current_val.array,
1702 #else /* __BIG_ENDIAN__ */
1703 _prop_append_ele_ptparray(prop->current_val.array,
1705 #endif /* __BIG_ENDIAN__ */
1707 } else if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT32) ||
1708 (prop->propinfo.data_type == PTP_DATATYPE_AINT32)) {
1710 ptr32 = (mtp_uint32 *) pval;
1711 for (ii = 0; ii < num_ele; ii++) {
1712 #ifdef __BIG_ENDIAN__
1714 _util_conv_byte_order(&swap32, sizeof(mtp_uint32));
1715 _prop_append_ele_ptparray(prop->current_val.array,
1717 #else /* __BIG_ENDIAN__ */
1718 _prop_append_ele_ptparray(prop->current_val.array,
1720 #endif /* __BIG_ENDIAN__ */
1729 mtp_bool _prop_set_current_device_prop(device_prop_desc_t *prop, mtp_uchar *val,
1732 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
1734 _prop_init_ptpstring(&str);
1735 _prop_parse_rawstring(&str, val, size);
1736 return _prop_set_current_string(prop, &str);
1738 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
1739 PTP_DATATYPE_ARRAY) {
1741 mtp_uint32 *ptr = (mtp_uint32 *) val;
1742 if (size < sizeof(mtp_uint32)) {
1745 if (size < sizeof(mtp_uint32) + ptr[0] * prop->propinfo.dts_size) {
1748 return _prop_set_current_array(prop, val);
1751 else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
1752 PTP_DATATYPE_VALUE) {
1754 if (prop->propinfo.dts_size > size) {
1758 if ((prop->propinfo.data_type == PTP_DATATYPE_INT64) ||
1759 (prop->propinfo.data_type == PTP_DATATYPE_UINT64) ||
1760 (prop->propinfo.data_type == PTP_DATATYPE_INT128) ||
1761 (prop->propinfo.data_type == PTP_DATATYPE_UINT128)) {
1763 /* No validation at this time */
1764 memcpy(prop->current_val.integer, val,
1765 prop->propinfo.dts_size);
1766 #ifdef __BIG_ENDIAN__
1767 _util_conv_byte_order(prop->current_val.integer,
1768 prop->propinfo.dts_size);
1769 #endif /* __BIG_ENDIAN__ */
1772 /* avoid using new_val = *(ddword*)val; */
1773 mtp_uint32 new_val = (mtp_uint32)0;
1774 memcpy(&new_val, val, size);
1775 #ifdef __BIG_ENDIAN__
1776 _util_conv_byte_order(&new_val, sizeof(mtp_uint32));
1777 #endif /* __BIG_ENDIAN__ */
1778 return _prop_set_current_integer(prop, new_val);
1785 mtp_bool _prop_set_current_integer_val(obj_prop_val_t *pval, mtp_uint64 val)
1787 if (_prop_is_valid_integer(&(pval->prop->propinfo), val)) {
1788 memset(pval->current_val.integer, 0,
1789 pval->prop->propinfo.dts_size * sizeof(mtp_byte));
1790 memcpy(pval->current_val.integer, &val,
1791 pval->prop->propinfo.dts_size * sizeof(mtp_byte));
1794 /* setting invalid value */
1799 mtp_bool _prop_set_current_string_val(obj_prop_val_t *pval, ptp_string_t *str)
1801 if (_prop_is_valid_string(&(pval->prop->propinfo), str)) {
1802 _prop_destroy_ptpstring(pval->current_val.str);
1803 #ifndef MTP_USE_VARIABLE_PTP_STRING_MALLOC
1804 pval->current_val.str = __alloc_ptpstring();
1805 #else /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
1806 pval->current_val.str = __alloc_ptpstring(str->num_chars);
1807 #endif /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
1808 if (pval->current_val.str != NULL) {
1809 _prop_copy_ptpstring (pval->current_val.str, str);
1814 /* setting invalid value */
1819 mtp_bool _prop_set_current_array_val(obj_prop_val_t *pval, mtp_uchar *arr,
1822 mtp_uint32 num_ele = 0;
1823 mtp_uchar *value = NULL;
1824 prop_info_t *propinfo = NULL;
1826 propinfo = &(pval->prop->propinfo);
1828 if (propinfo->data_type == PTP_DATATYPE_STRING) {
1830 _prop_init_ptpstring(&str);
1831 _prop_parse_rawstring(&str, arr, size);
1832 return _prop_set_current_string_val(pval, &str);
1834 } else if ((propinfo->data_type & PTP_DATATYPE_ARRAYMASK) ==
1835 PTP_DATATYPE_ARRAY) {
1837 if (size < sizeof(mtp_uint32))
1840 memcpy(&num_ele, arr, sizeof(mtp_uint32));
1841 DBG("parsed array num [%d]\n", num_ele);
1843 if (size < sizeof(mtp_uint32) +
1844 num_ele * (propinfo->dts_size)) {
1846 ERR("buffer size is not enough [%d]\n", size);
1850 value = arr + sizeof(mtp_uint32);
1852 if ((propinfo->data_type == PTP_DATATYPE_AUINT8) ||
1853 (propinfo->data_type == PTP_DATATYPE_AINT8)) {
1855 _prop_destroy_ptparray(pval->current_val.array);
1856 pval->current_val.array = _prop_alloc_ptparray(UINT8_TYPE);
1858 } else if ((propinfo->data_type == PTP_DATATYPE_AUINT16) ||
1859 (propinfo->data_type == PTP_DATATYPE_AINT16)) {
1861 _prop_destroy_ptparray(pval->current_val.array);
1862 pval->current_val.array = _prop_alloc_ptparray(UINT16_TYPE);
1864 } else if ((propinfo->data_type == PTP_DATATYPE_AUINT32) ||
1865 (propinfo->data_type == PTP_DATATYPE_AINT32)) {
1867 _prop_destroy_ptparray(pval->current_val.array);
1868 pval->current_val.array = _prop_alloc_ptparray(UINT32_TYPE);
1871 /* Copies the data into the PTP array */
1872 if ((pval->current_val.array != NULL) && (num_ele != 0)) {
1873 mtp_uchar *ptr8 = NULL;
1874 mtp_uint16 *ptr16 = NULL;
1875 mtp_uint32 *ptr32 = NULL;
1878 _prop_grow_ptparray(pval->current_val.array, num_ele);
1880 if ((propinfo->data_type == PTP_DATATYPE_AUINT8) ||
1881 (propinfo->data_type == PTP_DATATYPE_AINT8)) {
1883 ptr8 = (mtp_uchar *) value;
1884 for (ii = 0; ii < num_ele; ii++)
1885 _prop_append_ele_ptparray(pval->current_val.array,
1888 } else if ((propinfo->data_type == PTP_DATATYPE_AUINT16) ||
1889 (propinfo->data_type == PTP_DATATYPE_AINT16)) {
1890 ptr16 = (mtp_uint16 *) value;
1891 for (ii = 0; ii < num_ele; ii++)
1892 _prop_append_ele_ptparray(pval->current_val.array,
1895 } else if ((propinfo->data_type == PTP_DATATYPE_AUINT32) ||
1896 (propinfo->data_type == PTP_DATATYPE_AINT32)) {
1898 ptr32 = (mtp_uint32 *)value;
1899 for (ii = 0; ii < num_ele; ii++)
1900 _prop_append_ele_ptparray(pval->current_val.array,
1905 } else if ((propinfo->data_type & PTP_DATATYPE_VALUEMASK) ==
1906 PTP_DATATYPE_VALUE) {
1908 if (propinfo->dts_size > size)
1911 if ((propinfo->data_type == PTP_DATATYPE_INT64) ||
1912 (propinfo->data_type == PTP_DATATYPE_UINT64) ||
1913 (propinfo->data_type == PTP_DATATYPE_INT128) ||
1914 (propinfo->data_type == PTP_DATATYPE_UINT128)) {
1916 if (propinfo->data_type == PTP_DATATYPE_UINT64) {
1917 memcpy(pval->current_val.integer, arr,
1918 propinfo->dts_size);
1920 memcpy(pval->current_val.integer, arr,
1921 propinfo->dts_size);
1925 mtp_uint32 new_val = 0;
1926 memcpy(&new_val, arr, propinfo->dts_size);
1927 return _prop_set_current_integer_val(pval,
1934 #ifdef __BIG_ENDIAN__
1935 mtp_bool _prop_set_current_array_val_usbrawdata(obj_prop_val_t *pval,
1936 mtp_uchar *arr, mtp_uint32 size)
1938 mtp_uint32 num_ele = 0;
1939 mtp_uchar *value = NULL;
1940 prop_info_t *propinfo = NULL;
1942 propinfo = &(pval->prop->propinfo);
1944 if (propinfo->data_type == PTP_DATATYPE_STRING) {
1946 _prop_init_ptpstring(&str);
1947 _prop_parse_rawstring(&str, arr, size);
1948 return _prop_set_current_string_val(pval, &str);
1950 } else if ((propinfo->data_type & PTP_DATATYPE_ARRAYMASK) ==
1951 PTP_DATATYPE_ARRAY) {
1953 if (size < sizeof(mtp_uint32))
1956 memcpy(&num_ele, arr, sizeof(mtp_uint32));
1957 #ifdef __BIG_ENDIAN__
1958 _util_conv_byte_order(&num_ele, sizeof(mtp_uint32));
1959 #endif /* __BIG_ENDIAN__ */
1960 if (size < sizeof(mtp_uint32) + num_ele * propinfo->dts_size)
1963 value = arr + sizeof(mtp_uint32);
1965 if ((propinfo->data_type == PTP_DATATYPE_AUINT8) ||
1966 (propinfo->data_type == PTP_DATATYPE_AINT8)) {
1968 _prop_destroy_ptparray(pval->current_val.array);
1969 pval->current_val.array = _prop_alloc_ptparray(UINT8_TYPE);
1971 } else if ((propinfo->data_type == PTP_DATATYPE_AUINT16) ||
1972 (propinfo->data_type == PTP_DATATYPE_AINT16)) {
1974 _prop_destroy_ptparray(pval->current_val.array);
1975 pval->current_val.array = _prop_alloc_ptparray(UINT16_TYPE);
1977 } else if ((propinfo->data_type == PTP_DATATYPE_AUINT32) ||
1978 (propinfo->data_type == PTP_DATATYPE_AINT32)) {
1980 _prop_destroy_ptparray(pval->current_val.array);
1981 pval->current_val.array = _prop_alloc_ptparray(UINT32_TYPE);
1985 /* Copies the data into the PTP array */
1986 if ((pval->current_val.array != NULL) && (num_ele != 0)) {
1988 mtp_uchar *ptr8 = NULL;
1989 mtp_uint16 *ptr16 = NULL;
1990 mtp_uint32 *ptr32 = NULL;
1993 _prop_grow_ptparray(pval->current_val.array, num_ele);
1995 if ((propinfo->data_type == PTP_DATATYPE_AUINT8) ||
1996 (propinfo->data_type == PTP_DATATYPE_AINT8)) {
1998 ptr8 = (mtp_uchar *) arr;
1999 for (ii = 0; ii < num_ele; ii++)
2000 _prop_append_ele_ptparray(pval->current_val.array,
2003 } else if ((propinfo->data_type == PTP_DATATYPE_AUINT16) ||
2004 (propinfo->data_type ==
2005 PTP_DATATYPE_AINT16)) {
2007 ptr16 = (mtp_uint16 *) arr;
2008 #ifdef __BIG_ENDIAN__
2009 _util_conv_byte_order_gen_str(ptr16,
2010 num_ele, sizeof(mtp_uint16));
2011 #endif /* __BIG_ENDIAN__ */
2012 for (ii = 0; ii < num_ele; ii++)
2013 _prop_append_ele_ptparray(pval->current_val.array,
2016 } else if ((propinfo->data_type == PTP_DATATYPE_AUINT32) ||
2017 (propinfo->data_type ==
2018 PTP_DATATYPE_AINT32)) {
2020 ptr32 = (mtp_uint32 *) arr;
2021 #ifdef __BIG_ENDIAN__
2022 _util_conv_byte_order_gen_str(ptr32, num_ele,
2023 sizeof(mtp_uint32));
2024 #endif /* __BIG_ENDIAN__ */
2025 for (ii = 0; ii < num_ele; ii++)
2026 _prop_append_ele_ptparray(pval->current_val.array,
2031 } else if ((propinfo->data_type & PTP_DATATYPE_VALUEMASK) ==
2032 PTP_DATATYPE_VALUE) {
2034 if (propinfo->dts_size > size)
2037 if ((propinfo->data_type == PTP_DATATYPE_INT64) ||
2038 (propinfo->data_type == PTP_DATATYPE_UINT64) ||
2039 (propinfo->data_type == PTP_DATATYPE_INT128) ||
2040 (propinfo->data_type == PTP_DATATYPE_UINT128)) {
2042 memcpy(pval->current_val.integer, arr,
2043 propinfo->dts_size);
2044 #ifdef __BIG_ENDIAN__
2045 _util_conv_byte_order(pval->current_val.integer,
2046 propinfo->dts_size);
2047 #endif /* __BIG_ENDIAN__ */
2050 mtp_uint32 new_val = 0;
2051 memcpy(&new_val, arr, propinfo->dts_size);
2052 return _prop_set_current_integer_val(pval, new_val);
2057 #endif /* __BIG_ENDIAN__ */
2059 mtp_bool _prop_set_range_integer(prop_info_t *prop_info, mtp_uint32 min,
2060 mtp_uint32 max, mtp_uint32 step)
2062 if (((prop_info->data_type & PTP_DATATYPE_VALUEMASK) !=
2063 PTP_DATATYPE_VALUE) || (prop_info->form_flag != RANGE_FORM)) {
2067 prop_info->range.min_val = min;
2068 prop_info->range.max_val = max;
2069 prop_info->range.step_size = step;
2074 mtp_bool _prop_set_regexp(obj_prop_desc_t *prop, mtp_wchar *regex)
2078 if ((prop->propinfo.data_type != PTP_DATATYPE_STRING) ||
2079 (prop->propinfo.form_flag != REGULAR_EXPRESSION_FORM)) {
2082 #ifndef MTP_USE_VARIABLE_PTP_STRING_MALLOC
2083 str = __alloc_ptpstring();
2084 #else /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
2085 str = __alloc_ptpstring(_util_wchar_len(regex));
2086 #endif /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
2090 _prop_copy_char_to_ptpstring(str, regex, WCHAR_TYPE);
2091 prop->prop_forms.reg_exp = str;
2096 mtp_bool _prop_set_maxlen(obj_prop_desc_t *prop, mtp_uint32 max)
2098 if ((prop->propinfo.form_flag != BYTE_ARRAY_FORM) &&
2099 (prop->propinfo.form_flag != LONG_STRING_FORM)) {
2103 if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) !=
2104 PTP_DATATYPE_ARRAY) {
2108 prop->prop_forms.max_len = max;
2113 /* DeviceObjectPropDesc Functions */
2114 void _prop_init_device_property_desc(device_prop_desc_t *prop,
2115 mtp_uint16 propcode, mtp_uint16 data_type, mtp_uchar get_set,
2116 mtp_uchar form_flag)
2120 prop->propinfo.prop_code = propcode;
2121 prop->propinfo.data_type = data_type;
2122 prop->propinfo.get_set = get_set;
2123 prop->propinfo.default_val.str = NULL;
2124 prop->current_val.str = NULL;
2125 prop->propinfo.form_flag = form_flag;
2127 for (ii = 0; ii < 16; ii++) {
2128 prop->current_val.integer[ii] = 0;
2129 prop->propinfo.default_val.integer[ii] = 0;
2132 /* size of default value: DTS */
2133 switch (prop->propinfo.data_type) {
2134 case PTP_DATATYPE_UINT8:
2135 case PTP_DATATYPE_INT8:
2136 case PTP_DATATYPE_AINT8:
2137 case PTP_DATATYPE_AUINT8:
2138 prop->propinfo.dts_size = sizeof(mtp_uchar);
2141 case PTP_DATATYPE_UINT16:
2142 case PTP_DATATYPE_INT16:
2143 case PTP_DATATYPE_AINT16:
2144 case PTP_DATATYPE_AUINT16:
2145 prop->propinfo.dts_size = sizeof(mtp_uint16);
2148 case PTP_DATATYPE_UINT32:
2149 case PTP_DATATYPE_INT32:
2150 case PTP_DATATYPE_AINT32:
2151 case PTP_DATATYPE_AUINT32:
2152 prop->propinfo.dts_size = sizeof(mtp_uint32);
2155 case PTP_DATATYPE_UINT64:
2156 case PTP_DATATYPE_INT64:
2157 case PTP_DATATYPE_AINT64:
2158 case PTP_DATATYPE_AUINT64:
2159 prop->propinfo.dts_size = sizeof(mtp_int64);
2162 case PTP_DATATYPE_UINT128:
2163 case PTP_DATATYPE_INT128:
2164 case PTP_DATATYPE_AINT128:
2165 case PTP_DATATYPE_AUINT128:
2166 prop->propinfo.dts_size = 2 * sizeof(mtp_int64);
2169 case PTP_DATATYPE_STRING:
2171 /* don't know how to handle at this point (including PTP_DATATYPE_STRING) */
2172 prop->propinfo.dts_size = 0;
2176 _util_init_list(&(prop->propinfo.supp_value_list));
2181 mtp_uint32 _prop_size_device_prop_desc(device_prop_desc_t *prop)
2183 /* size :PropCode,Datatype,Getset,formflag */
2184 mtp_uint32 size = sizeof(mtp_uint16) + sizeof(mtp_uint16) +
2185 sizeof(mtp_uchar) + sizeof(mtp_uchar);
2187 /* size of default value: DTS */
2188 /* size of current value: DTS */
2189 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2191 size += _prop_size_ptpstring(prop->propinfo.default_val.str);
2192 size += _prop_size_ptpstring(prop->current_val.str);
2195 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2196 PTP_DATATYPE_ARRAY) {
2198 size += _prop_get_size_ptparray(prop->propinfo.default_val.array);
2199 size += _prop_get_size_ptparray(prop->current_val.array);
2202 size += 2 * prop->propinfo.dts_size;
2205 /* Add the size of the Form followed */
2206 switch (prop->propinfo.form_flag) {
2211 size += 3 * prop->propinfo.dts_size;
2215 /* Number of Values */
2216 size += sizeof(mtp_uint16);
2217 if (prop->propinfo.data_type != PTP_DATATYPE_STRING) {
2219 size += prop->propinfo.supp_value_list.nnodes *
2220 prop->propinfo.dts_size;
2223 slist_node_t *node = NULL;
2226 for (ii = 0, node = prop->propinfo.supp_value_list.start;
2227 ii < prop->propinfo.supp_value_list.nnodes;
2228 ii++, node = node->link) {
2230 size += _prop_size_ptpstring((ptp_string_t *) node->value);
2236 /* don't know how to handle */
2244 static mtp_uint32 __size_curval_device_prop(device_prop_desc_t *prop)
2246 mtp_uint32 size = 0;
2248 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2250 size = _prop_size_ptpstring(prop->current_val.str);
2252 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2253 PTP_DATATYPE_ARRAY) {
2255 size = _prop_get_size_ptparray(prop->current_val.array);
2257 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2258 PTP_DATATYPE_VALUE) {
2260 size = prop->propinfo.dts_size;
2265 mtp_uint32 _prop_pack_device_prop_desc(device_prop_desc_t *prop,
2266 mtp_uchar *buf, mtp_uint32 size)
2268 mtp_uchar *temp = buf;
2269 mtp_uint32 count = 0;
2270 mtp_uint32 bytes_to_write = 0;
2271 slist_node_t *node = NULL;
2274 if (!buf || size < _prop_size_device_prop_desc(prop)) {
2278 /* Pack propcode, data_type, & get_set */
2279 bytes_to_write = sizeof(mtp_uint16);
2280 memcpy(temp, &(prop->propinfo.prop_code), bytes_to_write);
2281 #ifdef __BIG_ENDIAN__
2282 _util_conv_byte_order(temp, bytes_to_write);
2283 #endif /* __BIG_ENDIAN__ */
2284 temp += bytes_to_write;
2286 bytes_to_write = sizeof(mtp_uint16);
2287 memcpy(temp, &(prop->propinfo.data_type), bytes_to_write);
2288 #ifdef __BIG_ENDIAN__
2289 _util_conv_byte_order(temp, bytes_to_write);
2290 #endif /* __BIG_ENDIAN__ */
2291 temp += bytes_to_write;
2293 bytes_to_write = sizeof(mtp_uchar);
2294 memcpy(temp, &(prop->propinfo.get_set), bytes_to_write);
2295 #ifdef __BIG_ENDIAN__
2296 _util_conv_byte_order(temp, bytes_to_write);
2297 #endif /* __BIG_ENDIAN__ */
2298 temp += bytes_to_write;
2300 /* Pack Default/Current Value: DTS */
2301 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2303 bytes_to_write = _prop_size_ptpstring(prop->propinfo.default_val.str);
2304 if (bytes_to_write !=
2305 _prop_pack_ptpstring(prop->propinfo.default_val.str,
2306 temp, bytes_to_write)) {
2308 return (mtp_uint32)(temp - buf);
2310 temp += bytes_to_write;
2312 bytes_to_write = _prop_size_ptpstring(prop->current_val.str);
2313 if (bytes_to_write !=
2314 _prop_pack_ptpstring(prop->current_val.str,
2315 temp, bytes_to_write)) {
2317 return (mtp_uint32)(temp - buf);
2319 temp += bytes_to_write;
2321 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2322 PTP_DATATYPE_ARRAY) {
2324 bytes_to_write = _prop_get_size_ptparray(prop->propinfo.default_val.array);
2325 if (bytes_to_write !=
2326 _prop_pack_ptparray(prop->propinfo.default_val.array,
2327 temp, bytes_to_write)) {
2329 return (mtp_uint32)(temp - buf);
2331 temp += bytes_to_write;
2333 bytes_to_write = _prop_get_size_ptparray(prop->current_val.array);
2334 if (bytes_to_write !=
2335 _prop_pack_ptparray(prop->current_val.array,
2336 temp, bytes_to_write)) {
2338 return (mtp_uint32)(temp - buf);
2340 temp += bytes_to_write;
2342 /* Add support for other array data types */
2343 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2344 PTP_DATATYPE_VALUE) {
2346 bytes_to_write = prop->propinfo.dts_size;
2347 memcpy(temp, prop->propinfo.default_val.integer, bytes_to_write);
2348 #ifdef __BIG_ENDIAN__
2349 _util_conv_byte_order(temp, bytes_to_write);
2350 #endif /* __BIG_ENDIAN__ */
2351 temp += bytes_to_write;
2353 memcpy(temp, prop->current_val.integer, bytes_to_write);
2354 #ifdef __BIG_ENDIAN__
2355 _util_conv_byte_order(temp, bytes_to_write);
2356 #endif /* __BIG_ENDIAN__ */
2357 temp += bytes_to_write;
2361 /* Now pack the FormFlag */
2362 memcpy(temp, &(prop->propinfo.form_flag), sizeof(mtp_uchar));
2363 temp += sizeof(mtp_uchar);
2365 /* Finally pack the Form followed */
2366 switch (prop->propinfo.form_flag) {
2371 /* Min, Max, & Step */
2372 memcpy(temp, &(prop->propinfo.range.min_val),
2373 prop->propinfo.dts_size);
2374 temp += prop->propinfo.dts_size;
2375 memcpy(temp, &(prop->propinfo.range.max_val),
2376 prop->propinfo.dts_size);
2377 temp += prop->propinfo.dts_size;
2378 memcpy(temp, &(prop->propinfo.range.step_size),
2379 prop->propinfo.dts_size);
2380 temp += prop->propinfo.dts_size;
2385 /* Pack Number of Values in this enumeration */
2386 count = prop->propinfo.supp_value_list.nnodes;
2388 memcpy(temp, &count, sizeof(mtp_uint16));
2389 #ifdef __BIG_ENDIAN__
2390 _util_conv_byte_order(temp, sizeof(mtp_uint16));
2391 #endif /* __BIG_ENDIAN__ */
2392 temp += sizeof(mtp_uint16);
2394 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2396 for (ii = 0, node = prop->propinfo.supp_value_list.start;
2397 ii < prop->propinfo.supp_value_list.nnodes;
2398 ii++, node = node->link) {
2401 _prop_size_ptpstring((ptp_string_t *) node->value);
2402 if (bytes_to_write !=
2403 _prop_pack_ptpstring((ptp_string_t *) node->value,
2404 temp, bytes_to_write)) {
2406 return (mtp_uint32)(temp - buf);
2408 temp += bytes_to_write;
2412 mtp_uint32 value = 0;
2414 for (ii = 0, node = prop->propinfo.supp_value_list.start;
2415 ii < prop->propinfo.supp_value_list.nnodes;
2416 ii++, node = node->link) {
2418 value = (mtp_uint32)node->value;
2419 memcpy(temp, &value, prop->propinfo.dts_size);
2420 #ifdef __BIG_ENDIAN__
2421 _util_conv_byte_order(temp, prop->propinfo.dts_size);
2422 #endif /* __BIG_ENDIAN__ */
2423 temp += prop->propinfo.dts_size;
2429 /*don't know how to handle */
2434 return (mtp_uint32)(temp - buf);
2437 mtp_uint32 _prop_pack_curval_device_prop_desc(device_prop_desc_t *prop,
2438 mtp_uchar *buf, mtp_uint32 size)
2440 mtp_uint32 bytes_to_write;
2442 bytes_to_write = __size_curval_device_prop(prop);
2444 if ((!bytes_to_write) || (buf == NULL) || (size < bytes_to_write)) {
2448 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2449 if (bytes_to_write != _prop_pack_ptpstring(prop->current_val.str,
2450 buf, bytes_to_write)) {
2453 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2454 PTP_DATATYPE_ARRAY) {
2456 if (bytes_to_write != _prop_pack_ptparray(prop->current_val.array,
2457 buf, bytes_to_write)) {
2460 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2461 PTP_DATATYPE_VALUE) {
2462 /* this property is of type UINT8, ... */
2463 memcpy(buf, prop->current_val.integer, bytes_to_write);
2464 #ifdef __BIG_ENDIAN__
2465 _util_conv_byte_order(buf, bytes_to_write);
2466 #endif /* __BIG_ENDIAN__ */
2471 return bytes_to_write;
2474 void _prop_reset_device_prop_desc(device_prop_desc_t *prop)
2476 ret_if(prop == NULL);
2478 if (prop->propinfo.get_set == PTP_PROPGETSET_GETONLY)
2481 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2483 _prop_destroy_ptpstring(prop->current_val.str);
2484 #ifndef MTP_USE_VARIABLE_PTP_STRING_MALLOC
2485 prop->current_val.str = __alloc_ptpstring();
2486 #else /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
2487 prop->current_val.str = __alloc_ptpstring(prop->propinfo.default_val.str->num_chars);
2488 #endif /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
2489 if (NULL == prop->current_val.str)
2492 _prop_copy_ptpstring (prop->current_val.str,
2493 prop->propinfo.default_val.str);
2495 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2496 PTP_DATATYPE_ARRAY) {
2498 _prop_destroy_ptparray(prop->current_val.array);
2499 prop->current_val.array = _prop_alloc_ptparray(UINT32_TYPE);
2500 if (NULL == prop->current_val.array)
2503 _prop_copy_ptparray(prop->current_val.array,
2504 prop->propinfo.default_val.array);
2506 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2507 PTP_DATATYPE_VALUE) {
2510 for (ii = 0; ii < 16; ii++)
2511 prop->current_val.integer[ii] =
2512 prop->propinfo.default_val.integer[ii];
2516 /* ObjectPropVal Functions */
2517 obj_prop_val_t * _prop_alloc_obj_propval(obj_prop_desc_t *prop)
2519 obj_prop_val_t *pval = NULL;
2520 pval = (obj_prop_val_t *)g_malloc(sizeof(obj_prop_val_t));
2523 __init_obj_propval(pval, prop);
2529 static void __init_obj_propval(obj_prop_val_t *pval, obj_prop_desc_t *prop)
2535 for (ii = 0; ii < 16; ii++) {
2536 pval->current_val.integer[ii] = 0;
2539 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2541 #ifndef MTP_USE_VARIABLE_PTP_STRING_MALLOC
2542 pval->current_val.str = __alloc_ptpstring();
2543 #else /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
2544 pval->current_val.str = __alloc_ptpstring(prop->propinfo.default_val.str->num_chars);
2545 #endif /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
2546 if (NULL == pval->current_val.str)
2548 _prop_copy_ptpstring (pval->current_val.str,
2549 prop->propinfo.default_val.str);
2550 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2551 PTP_DATATYPE_VALUE) {
2553 memcpy(pval->current_val.integer,
2554 prop->propinfo.default_val.integer,
2555 prop->propinfo.dts_size);
2557 if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT8) ||
2558 (prop->propinfo.data_type == PTP_DATATYPE_AINT8)) {
2560 pval->current_val.array = _prop_alloc_ptparray(UINT8_TYPE);
2561 if (NULL == pval->current_val.array)
2564 _prop_copy_ptparray(pval->current_val.array,
2565 prop->propinfo.default_val.array);
2567 } else if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT16) ||
2568 (prop->propinfo.data_type == PTP_DATATYPE_AINT16)) {
2570 pval->current_val.array = _prop_alloc_ptparray(UINT16_TYPE);
2571 if (NULL == pval->current_val.array)
2574 _prop_copy_ptparray(pval->current_val.array,
2575 prop->propinfo.default_val.array);
2577 } else if ((prop->propinfo.data_type == PTP_DATATYPE_AUINT32) ||
2578 (prop->propinfo.data_type == PTP_DATATYPE_AINT32)) {
2580 pval->current_val.array = _prop_alloc_ptparray(UINT32_TYPE);
2581 if (NULL == pval->current_val.array)
2584 _prop_copy_ptparray(pval->current_val.array,
2585 prop->propinfo.default_val.array);
2588 /* Add support for other array data types */
2593 obj_prop_val_t *_prop_get_prop_val(mtp_obj_t *obj, mtp_uint32 propcode)
2595 obj_prop_val_t *prop_val = NULL;
2596 slist_node_t *node = NULL;
2599 /*Update the properties if count is zero*/
2600 if (obj->propval_list.nnodes == 0)
2601 _prop_update_property_values_list(obj);
2603 for (ii = 0, node = obj->propval_list.start;
2604 ii < obj->propval_list.nnodes; ii++, node = node->link) {
2605 if (node == NULL || node->value == NULL)
2608 prop_val = (obj_prop_val_t *)node->value;
2610 if (prop_val->prop->propinfo.prop_code == propcode) {
2619 /* update property and try again */
2620 _prop_update_property_values_list(obj);
2622 for (ii = 0, node = obj->propval_list.start;
2623 ii < obj->propval_list.nnodes;
2624 ii++, node = node->link) {
2625 if (node == NULL || node->value == NULL)
2628 prop_val = (obj_prop_val_t *)node->value;
2629 if ((prop_val) && (prop_val->prop->propinfo.prop_code ==
2634 ERR("node or node->value is null. try again but not found");
2638 mtp_uint32 _prop_pack_obj_propval(obj_prop_val_t *pval, mtp_uchar *buf,
2641 mtp_uint32 bytes_to_write = _prop_size_obj_propval(pval);
2643 if ((!bytes_to_write) || (buf == NULL) || (size < bytes_to_write)) {
2647 if (pval->prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2649 if (bytes_to_write != _prop_pack_ptpstring(pval->current_val.str,
2650 buf, bytes_to_write)) {
2653 } else if ((pval->prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2654 PTP_DATATYPE_ARRAY) {
2656 if (bytes_to_write != _prop_pack_ptparray(pval->current_val.array,
2661 } else if ((pval->prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2662 PTP_DATATYPE_VALUE) {
2664 /* this property is of type UINT8, ... */
2665 memcpy(buf, pval->current_val.integer, bytes_to_write);
2666 #ifdef __BIG_ENDIAN__
2667 _util_conv_byte_order(buf, bytes_to_write);
2668 #endif /* __BIG_ENDIAN__ */
2673 return bytes_to_write;
2677 mtp_uint32 _prop_size_obj_propval(obj_prop_val_t *pval)
2679 mtp_uint32 size = 0;
2681 if (pval == NULL || pval->prop == NULL)
2684 if (pval->prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2685 if (pval->current_val.str == NULL) {
2688 size = _prop_size_ptpstring(pval->current_val.str);
2691 } else if ((pval->prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2692 PTP_DATATYPE_ARRAY) {
2693 size = _prop_get_size_ptparray(pval->current_val.array);
2695 } else if ((pval->prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2696 PTP_DATATYPE_VALUE) {
2697 size = pval->prop->propinfo.dts_size;
2703 void _prop_destroy_obj_propval(obj_prop_val_t *pval)
2709 if (pval->prop == NULL) {
2715 if (pval->prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2716 if (pval->current_val.str) {
2717 _prop_destroy_ptpstring(pval->current_val.str);
2718 pval->current_val.str = NULL;
2720 } else if ((pval->prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2721 PTP_DATATYPE_ARRAY) {
2722 _prop_destroy_ptparray(pval->current_val.array);
2723 pval->current_val.array = NULL;
2734 static void __init_obj_prop_desc(obj_prop_desc_t *prop, mtp_uint16 propcode,
2735 mtp_uint16 data_type, mtp_uchar get_set, mtp_uchar form_flag,
2736 mtp_uint32 group_code)
2739 prop->propinfo.prop_code = propcode;/*Property code for this property*/
2740 prop->propinfo.data_type = data_type; /* 2=byte, 4=word,
2741 * 6=dword, 0xFFFF=String)
2743 prop->propinfo.get_set = get_set; /* 0=get-only, 1=get-set */
2744 prop->propinfo.default_val.str = NULL; /* Default value for a String value type */
2746 prop->propinfo.form_flag = form_flag;
2748 if (prop->propinfo.form_flag == BYTE_ARRAY_FORM) {
2749 prop->propinfo.data_type = PTP_DATATYPE_AUINT8;
2750 } else if (prop->propinfo.form_flag == LONG_STRING_FORM) {
2751 prop->propinfo.data_type = PTP_DATATYPE_AUINT16;
2754 prop->group_code = group_code;
2756 /* Zero out the integer byte array */
2757 for (ii = 0; ii < 16; ii++)
2758 prop->propinfo.default_val.integer[ii] = 0;
2760 /* size of default value: DTS */
2761 switch (prop->propinfo.data_type) {
2763 case PTP_DATATYPE_UINT8:
2764 case PTP_DATATYPE_INT8:
2765 case PTP_DATATYPE_AINT8:
2766 case PTP_DATATYPE_AUINT8:
2767 prop->propinfo.dts_size = sizeof(mtp_uchar);
2770 case PTP_DATATYPE_UINT16:
2771 case PTP_DATATYPE_INT16:
2772 case PTP_DATATYPE_AINT16:
2773 case PTP_DATATYPE_AUINT16:
2774 prop->propinfo.dts_size = sizeof(mtp_uint16);
2777 case PTP_DATATYPE_UINT32:
2778 case PTP_DATATYPE_INT32:
2779 case PTP_DATATYPE_AINT32:
2780 case PTP_DATATYPE_AUINT32:
2781 prop->propinfo.dts_size = sizeof(mtp_uint32);
2784 case PTP_DATATYPE_UINT64:
2785 case PTP_DATATYPE_INT64:
2786 case PTP_DATATYPE_AINT64:
2787 case PTP_DATATYPE_AUINT64:
2788 prop->propinfo.dts_size = sizeof(mtp_int64);
2791 case PTP_DATATYPE_UINT128:
2792 case PTP_DATATYPE_INT128:
2793 case PTP_DATATYPE_AINT128:
2794 case PTP_DATATYPE_AUINT128:
2795 prop->propinfo.dts_size = 2 * sizeof(mtp_int64);
2798 case PTP_DATATYPE_STRING:
2800 prop->propinfo.dts_size = 0;
2804 _util_init_list(&(prop->propinfo.supp_value_list));
2806 prop->prop_forms.reg_exp = NULL;
2807 prop->prop_forms.max_len = 0;
2812 static mtp_uint32 __get_size_default_val_obj_prop_desc(obj_prop_desc_t *prop)
2814 mtp_uint32 size = 0;
2816 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2818 size = _prop_size_ptpstring(prop->propinfo.default_val.str);
2820 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2821 PTP_DATATYPE_ARRAY) {
2823 size = _prop_get_size_ptparray(prop->propinfo.default_val.array);
2825 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2826 PTP_DATATYPE_VALUE) {
2828 size = prop->propinfo.dts_size;
2834 mtp_uint32 _prop_size_obj_prop_desc(obj_prop_desc_t *prop)
2837 sizeof(mtp_uint16) + sizeof(mtp_uint16) + sizeof(mtp_uchar) +
2838 sizeof(mtp_uint32) + sizeof(mtp_uchar);
2840 /* size of default value: DTS */
2841 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2843 size += _prop_size_ptpstring(prop->propinfo.default_val.str);
2845 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2846 PTP_DATATYPE_ARRAY) {
2848 size += _prop_get_size_ptparray(prop->propinfo.default_val.array);
2850 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2851 PTP_DATATYPE_VALUE) {
2853 size += prop->propinfo.dts_size;
2856 /* Add the size of the Form followed */
2857 switch (prop->propinfo.form_flag) {
2862 if (prop->propinfo.data_type != PTP_DATATYPE_STRING) {
2863 size += 3 * prop->propinfo.dts_size;/* Min,Max,Step */
2868 /* Number of Values */
2869 size += sizeof(mtp_uint16);
2870 if (prop->propinfo.data_type != PTP_DATATYPE_STRING) {
2871 size += prop->propinfo.supp_value_list.nnodes *
2872 prop->propinfo.dts_size;
2874 slist_node_t *node = NULL;
2877 for (ii = 0, node = prop->propinfo.supp_value_list.start;
2878 ii < prop->propinfo.supp_value_list.nnodes;
2879 ii++, node = node->link) {
2881 size += _prop_size_ptpstring((ptp_string_t *) node->value);
2886 case DATE_TIME_FORM:
2889 case REGULAR_EXPRESSION_FORM:
2890 size += _prop_size_ptpstring(prop->prop_forms.reg_exp);
2893 case BYTE_ARRAY_FORM:
2894 case LONG_STRING_FORM:
2895 size += sizeof(prop->prop_forms.max_len);
2899 /*don't know how to handle */
2907 mtp_uint32 _prop_pack_obj_prop_desc(obj_prop_desc_t *prop, mtp_uchar *buf,
2910 mtp_uchar *temp = buf;
2911 mtp_uint32 count = 0;
2912 mtp_uint32 bytes_to_write = 0;
2913 slist_node_t *node = NULL;
2916 if (!buf || size < _prop_size_obj_prop_desc(prop)) {
2920 /* Pack propcode, data_type, & get_set */
2921 bytes_to_write = sizeof(mtp_uint16);
2922 memcpy(temp, &(prop->propinfo.prop_code), bytes_to_write);
2923 #ifdef __BIG_ENDIAN__
2924 _util_conv_byte_order(temp, bytes_to_write);
2925 #endif /* __BIG_ENDIAN__ */
2926 temp += bytes_to_write;
2928 bytes_to_write = sizeof(mtp_uint16);
2929 memcpy(temp, &(prop->propinfo.data_type), bytes_to_write);
2930 #ifdef __BIG_ENDIAN__
2931 _util_conv_byte_order(temp, bytes_to_write);
2932 #endif /* __BIG_ENDIAN__ */
2933 temp += bytes_to_write;
2935 bytes_to_write = sizeof(mtp_uchar);
2936 memcpy(temp, &(prop->propinfo.get_set), bytes_to_write);
2937 #ifdef __BIG_ENDIAN__
2938 _util_conv_byte_order(temp, bytes_to_write);
2939 #endif /* __BIG_ENDIAN__ */
2940 temp += bytes_to_write;
2942 /* Pack Default Value: DTS */
2943 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
2946 _prop_size_ptpstring(prop->propinfo.default_val.str);
2947 if (bytes_to_write != _prop_pack_ptpstring(prop->propinfo.default_val.str,
2948 temp, bytes_to_write)) {
2949 return (mtp_uint32)(temp - buf);
2951 temp += bytes_to_write;
2953 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
2954 PTP_DATATYPE_ARRAY) {
2956 bytes_to_write = _prop_get_size_ptparray(prop->propinfo.default_val.array);
2957 if (bytes_to_write != _prop_pack_ptparray(prop->propinfo.default_val.array,
2958 temp, bytes_to_write)) {
2959 return (mtp_uint32)(temp - buf);
2961 temp += bytes_to_write;
2963 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
2964 PTP_DATATYPE_VALUE) {
2966 bytes_to_write = prop->propinfo.dts_size;
2967 memcpy(temp, prop->propinfo.default_val.integer, bytes_to_write);
2968 #ifdef __BIG_ENDIAN__
2969 _util_conv_byte_order(temp, bytes_to_write);
2970 #endif /* __BIG_ENDIAN__ */
2971 temp += bytes_to_write;
2974 /* Pack group_code */
2975 memcpy(temp, &(prop->group_code), sizeof(mtp_uint32));
2976 #ifdef __BIG_ENDIAN__
2977 _util_conv_byte_order(temp, sizeof(mtp_uint32));
2978 #endif /* __BIG_ENDIAN__ */
2979 temp += sizeof(mtp_uint32);
2981 /* Pack the FormFlag */
2982 memcpy(temp, &(prop->propinfo.form_flag), sizeof(mtp_uchar));
2983 #ifdef __BIG_ENDIAN__
2984 _util_conv_byte_order(temp, sizeof(mtp_uchar));
2985 #endif /* __BIG_ENDIAN__ */
2986 temp += sizeof(mtp_uchar);
2988 /* Pack the Form Flag values */
2989 switch (prop->propinfo.form_flag) {
2994 /* Min, Max, & Step */
2995 memcpy(temp, &(prop->propinfo.range.min_val),
2996 prop->propinfo.dts_size);
2997 #ifdef __BIG_ENDIAN__
2998 _util_conv_byte_order(temp, prop->propinfo.dts_size);
2999 #endif /* __BIG_ENDIAN__ */
3000 temp += prop->propinfo.dts_size;
3001 memcpy(temp, &(prop->propinfo.range.max_val),
3002 prop->propinfo.dts_size);
3003 #ifdef __BIG_ENDIAN__
3004 _util_conv_byte_order(temp, prop->propinfo.dts_size);
3005 #endif /* __BIG_ENDIAN__ */
3006 temp += prop->propinfo.dts_size;
3007 memcpy(temp, &(prop->propinfo.range.step_size),
3008 prop->propinfo.dts_size);
3009 #ifdef __BIG_ENDIAN__
3010 _util_conv_byte_order(temp, prop->propinfo.dts_size);
3011 #endif /* __BIG_ENDIAN__ */
3012 temp += prop->propinfo.dts_size;
3017 /* Pack Number of Values in this enumeration */
3018 count = prop->propinfo.supp_value_list.nnodes;
3020 memcpy(temp, &count, sizeof(mtp_uint16));
3021 #ifdef __BIG_ENDIAN__
3022 _util_conv_byte_order(temp, sizeof(mtp_uint16));
3023 #endif /* __BIG_ENDIAN__ */
3024 temp += sizeof(mtp_uint16);
3026 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
3028 for (ii = 0, node = prop->propinfo.supp_value_list.start;
3029 ii < prop->propinfo.supp_value_list.nnodes;
3030 ii++, node = node->link) {
3033 _prop_size_ptpstring((ptp_string_t *) node->value);
3034 if (bytes_to_write !=
3035 _prop_pack_ptpstring((ptp_string_t *) node->value,
3036 temp, bytes_to_write)) {
3037 return (mtp_uint32) (temp - buf);
3039 temp += bytes_to_write;
3042 mtp_uint32 value = 0;
3044 for (ii = 0, node = prop->propinfo.supp_value_list.start;
3045 ii < prop->propinfo.supp_value_list.nnodes;
3046 ii++, node = node->link) {
3048 value = (mtp_uint32)node->value;
3049 memcpy(temp, &value, prop->propinfo.dts_size);
3050 #ifdef __BIG_ENDIAN__
3051 _util_conv_byte_order(temp, prop->propinfo.dts_size);
3052 #endif /* __BIG_ENDIAN__ */
3053 temp += prop->propinfo.dts_size;
3058 case DATE_TIME_FORM:
3061 case REGULAR_EXPRESSION_FORM:
3062 bytes_to_write = _prop_size_ptpstring(prop->prop_forms.reg_exp);
3063 if (bytes_to_write !=
3064 _prop_pack_ptpstring(prop->prop_forms.reg_exp,
3065 temp, bytes_to_write)) {
3067 return (mtp_uint32)(temp - buf);
3069 temp += bytes_to_write;
3072 case BYTE_ARRAY_FORM:
3073 case LONG_STRING_FORM:
3074 memcpy(temp, &prop->prop_forms.max_len,
3075 sizeof(prop->prop_forms.max_len));
3076 #ifdef __BIG_ENDIAN__
3077 _util_conv_byte_order(temp, sizeof(prop->prop_forms.max_len));
3078 #endif /* __BIG_ENDIAN__ */
3079 temp += sizeof(prop->prop_forms.max_len);
3083 /*don't know how to handle */
3088 return (mtp_uint32)(temp - buf);
3091 mtp_uint32 _prop_pack_default_val_obj_prop_desc(obj_prop_desc_t *prop,
3092 mtp_uchar *buf, mtp_uint32 size)
3094 mtp_uint32 bytes_to_write;
3096 bytes_to_write = __get_size_default_val_obj_prop_desc(prop);
3098 if ((!bytes_to_write) || (buf == NULL) || (size < bytes_to_write)) {
3102 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
3103 if (bytes_to_write !=
3104 _prop_pack_ptpstring(prop->propinfo.default_val.str,
3105 buf, bytes_to_write)) {
3108 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
3109 PTP_DATATYPE_ARRAY) {
3110 if (bytes_to_write !=
3111 _prop_pack_ptparray(prop->propinfo.default_val.array,
3112 buf, bytes_to_write)) {
3115 } else if ((prop->propinfo.data_type & PTP_DATATYPE_VALUEMASK) ==
3116 PTP_DATATYPE_VALUE) {
3117 /* this property is of type UINT8, ... */
3118 memcpy(buf, prop->propinfo.default_val.integer, bytes_to_write);
3119 #ifdef __BIG_ENDIAN__
3120 _util_conv_byte_order(buf, bytes_to_write);
3121 #endif /* __BIG_ENDIAN__ */
3126 return bytes_to_write;
3129 obj_prop_desc_t *_prop_get_obj_prop_desc(mtp_uint32 format_code,
3130 mtp_uint32 propcode)
3133 int num_default_obj_props = 0;
3136 if (_get_oma_drm_status() == TRUE) {
3137 num_default_obj_props = NUM_OBJECT_PROP_DESC_DEFAULT;
3139 num_default_obj_props = NUM_OBJECT_PROP_DESC_DEFAULT - 1;
3142 for (i = 0; i < num_default_obj_props; i++) {
3143 if (props_list_default[i].propinfo.prop_code == propcode) {
3144 return &(props_list_default[i]);
3148 switch (format_code) {
3151 for (i = 0; i < NUM_OBJECT_PROP_DESC_MP3; i++) {
3152 if (props_list_mp3[i].propinfo.prop_code == propcode) {
3153 return &(props_list_mp3[i]);
3158 for (i = 0; i < NUM_OBJECT_PROP_DESC_WMA; i++) {
3159 if (props_list_wma[i].propinfo.prop_code == propcode) {
3160 return &(props_list_wma[i]);
3170 for (i = 0; i < NUM_OBJECT_PROP_DESC_WMV; i++) {
3171 if (props_list_wmv[i].propinfo.prop_code == propcode) {
3172 return &(props_list_wmv[i]);
3176 case MTP_FMT_ABSTRACT_AUDIO_ALBUM:
3177 case PTP_FMT_IMG_EXIF:
3178 case PTP_FMT_IMG_GIF:
3179 case PTP_FMT_IMG_BMP:
3180 case PTP_FMT_IMG_PNG:
3181 for (i = 0; i < NUM_OBJECT_PROP_DESC_ALBUM; i++) {
3182 if (props_list_album[i].propinfo.prop_code == propcode) {
3183 return &(props_list_album[i]);
3192 ERR("No matched property[0x%x], format[0x%x]!!\n", propcode,
3197 static void __destroy_obj_prop_desc(obj_prop_desc_t *prop)
3199 slist_node_t *node = NULL;
3200 slist_node_t *next_node = NULL;
3203 if (prop->propinfo.data_type == PTP_DATATYPE_STRING) {
3205 if (prop->propinfo.default_val.str) {
3207 _prop_destroy_ptpstring(prop->propinfo.default_val.str);
3208 prop->propinfo.default_val.str = NULL;
3211 if (prop->propinfo.form_flag == ENUM_FORM) {
3213 for (node = prop->propinfo.supp_value_list.start, ii = 0;
3214 ii < prop->propinfo.supp_value_list.nnodes;
3215 node = node->link, ii++) {
3216 _prop_destroy_ptpstring((ptp_string_t *) node->value);
3220 if (prop->propinfo.form_flag == REGULAR_EXPRESSION_FORM) {
3222 if (prop->prop_forms.reg_exp != NULL) {
3223 _prop_destroy_ptpstring(prop->prop_forms.reg_exp);
3224 prop->prop_forms.reg_exp = NULL;
3227 } else if ((prop->propinfo.data_type & PTP_DATATYPE_ARRAYMASK) ==
3228 PTP_DATATYPE_ARRAY) {
3230 if (prop->propinfo.default_val.array) {
3232 _prop_destroy_ptparray(prop->propinfo.default_val.array);
3233 prop->propinfo.default_val.array = NULL;
3237 /* deallocate memory consumed by list elements */
3238 next_node = prop->propinfo.supp_value_list.start;
3239 for (ii = 0; ii < prop->propinfo.supp_value_list.nnodes; ii++) {
3241 next_node = next_node->link;
3247 /* Objectproplist functions */
3248 static mtp_uint32 __count_obj_proplist(obj_proplist_t *prop_list)
3250 return prop_list->prop_quad_list.nnodes;
3253 mtp_uint32 _prop_size_obj_proplist(obj_proplist_t *prop_list)
3255 prop_quad_t *quad = NULL;
3256 slist_node_t *node = NULL;
3260 /* for the NumberOfElements field in objpropvalList Dataset */
3261 size = sizeof(mtp_uint32);
3263 /* add all the fixed length members of the list */
3264 size += prop_list->prop_quad_list.nnodes * (sizeof(mtp_uint32) +
3265 sizeof(mtp_uint16) + sizeof(mtp_uint16));
3266 node = prop_list->prop_quad_list.start;
3267 for (ii = 0; ii < prop_list->prop_quad_list.nnodes; ii++) {
3268 quad = (prop_quad_t *) node->value;
3270 size += quad->val_size;
3277 mtp_uint32 _prop_get_obj_proplist(mtp_obj_t *obj, mtp_uint32 propcode,
3278 mtp_uint32 group_code, obj_proplist_t *prop_list)
3280 obj_prop_val_t *propval = NULL;
3281 slist_node_t *node = NULL;
3284 if (obj->propval_list.nnodes == 0) {
3285 if (FALSE == _prop_update_property_values_list(obj)) {
3286 ERR("update Property Values FAIL!!");
3290 for (ii = 0, node = obj->propval_list.start;
3291 ii < obj->propval_list.nnodes;
3292 ii++, node = node->link) {
3293 propval = (obj_prop_val_t *)node->value;
3295 if (NULL == propval) {
3299 if (FALSE == __check_object_propcode(propval->prop,
3300 propcode, group_code)) {
3303 __append_obj_proplist(prop_list, obj->obj_handle,
3304 propval->prop->propinfo.prop_code,
3305 propval->prop->propinfo.data_type,
3306 (mtp_uchar *)propval->current_val.integer);
3309 return __count_obj_proplist(prop_list);
3312 mtp_bool _prop_update_property_values_list(mtp_obj_t *obj)
3315 mtp_char guid[16] = { 0 };
3316 slist_node_t *node = NULL;
3317 slist_node_t *next_node = NULL;
3318 ptp_time_string_t create_tm, modify_tm;
3319 mtp_uint32 fmt_code = obj->obj_info->obj_fmt;
3320 mtp_wchar buf[MTP_MAX_PATHNAME_SIZE+1] = { 0 };
3321 mtp_char file_name[MTP_MAX_FILENAME_SIZE + 1] = { 0 };
3322 mtp_wchar w_file_name[MTP_MAX_FILENAME_SIZE + 1] = { 0 };
3323 char filename_wo_extn[MTP_MAX_PATHNAME_SIZE + 1] = { 0 };
3324 mtp_wchar object_fullpath[MTP_MAX_PATHNAME_SIZE * 2 + 1] = { 0 };
3326 retv_if(obj == NULL, FALSE);
3327 retv_if(obj->obj_info == NULL, FALSE);
3329 if (obj->propval_list.nnodes > 0) {
3331 * Remove all the old property value,
3332 * and ready to set up new list
3334 for (ii = 0, next_node = obj->propval_list.start;
3335 ii < obj->propval_list.nnodes; ii++) {
3337 next_node = node->link;
3338 _prop_destroy_obj_propval((obj_prop_val_t *)
3342 obj->propval_list.start = NULL;
3343 obj->propval_list.end = NULL;
3344 obj->propval_list.nnodes = 0;
3348 /* Populate Object Info to Object properties */
3349 if (obj->file_path == NULL || obj->file_path[0] != '/') {
3350 ERR_SECURE("Path is not valid.. path = [%s]\n",
3356 retv_if(FALSE == __create_prop_integer(obj,
3357 MTP_OBJ_PROPERTYCODE_STORAGEID,
3358 obj->obj_info->store_id), FALSE);
3361 retv_if(FALSE == __create_prop_integer(obj,
3362 MTP_OBJ_PROPERTYCODE_OBJECTFORMAT,
3363 obj->obj_info->obj_fmt), FALSE);
3365 /*PROTECTION STATUS*/
3366 retv_if(FALSE == __create_prop_integer(obj,
3367 MTP_OBJ_PROPERTYCODE_PROTECTIONSTATUS,
3368 obj->obj_info->protcn_status), FALSE);
3371 retv_if(FALSE == __create_prop_integer(obj,
3372 MTP_OBJ_PROPERTYCODE_OBJECTSIZE,
3373 obj->obj_info->file_size), FALSE);
3376 _util_get_file_name(obj->file_path, file_name);
3377 _util_utf8_to_utf16(w_file_name, sizeof(w_file_name) / WCHAR_SIZ, file_name);
3378 retv_if(FALSE == __create_prop_string(obj,
3379 MTP_OBJ_PROPERTYCODE_OBJECTFILENAME, w_file_name), FALSE);
3382 retv_if(FALSE == __create_prop_integer(obj,
3383 MTP_OBJ_PROPERTYCODE_PARENT, obj->obj_info->h_parent), FALSE);
3386 _util_utf8_to_utf16(object_fullpath,
3387 sizeof(object_fullpath) / WCHAR_SIZ, obj->file_path);
3388 _util_conv_wstr_to_guid(object_fullpath, (mtp_uint64 *) guid);
3389 retv_if((FALSE == __create_prop_array(obj,
3390 MTP_OBJ_PROPERTYCODE_PERSISTENTGUID,
3391 guid, sizeof(guid))), FALSE);
3394 retv_if(FALSE == __create_prop_integer(obj,
3395 MTP_OBJ_PROPERTYCODE_NONCONSUMABLE, 0), FALSE);
3397 _entity_get_file_times(obj, &create_tm, &modify_tm);
3399 retv_if(FALSE == __create_prop_timestring(obj, MTP_OBJ_PROPERTYCODE_DATEMODIFIED,
3400 &modify_tm), FALSE);
3403 retv_if(FALSE == __create_prop_timestring(obj, MTP_OBJ_PROPERTYCODE_DATECREATED,
3404 &create_tm), FALSE);
3407 _util_get_file_name_wo_extn(obj->file_path,
3409 _util_utf8_to_utf16(buf, sizeof(buf) / WCHAR_SIZ, filename_wo_extn);
3410 retv_if(FALSE == __create_prop_string(obj,
3411 MTP_OBJ_PROPERTYCODE_NAME, buf), FALSE);
3413 /*ASSOCIATION TYPE*/
3414 retv_if(FALSE == __create_prop_integer(obj,
3415 MTP_OBJ_PROPERTYCODE_ASSOCIATIONTYPE,
3416 obj->obj_info->association_type), FALSE);
3419 if (_get_oma_drm_status() == TRUE) {
3420 retv_if(FALSE == __create_prop_integer(obj,
3421 MTP_OBJ_PROPERTYCODE_OMADRMSTATUS, 0), FALSE);
3425 if (fmt_code == PTP_FMT_MP3 ||
3426 fmt_code == MTP_FMT_WMA ||
3427 fmt_code == PTP_FMT_WAVE ||
3428 fmt_code == MTP_FMT_FLAC) {
3429 __update_prop_values_audio(obj);
3431 } else if (fmt_code == MTP_FMT_WMV ||
3432 fmt_code == PTP_FMT_ASF ||
3433 fmt_code == MTP_FMT_MP4 ||
3434 fmt_code == PTP_FMT_AVI ||
3435 fmt_code == PTP_FMT_MPEG) {
3436 __update_prop_values_video(obj);
3438 } else if (fmt_code == PTP_FMT_IMG_EXIF ||
3439 fmt_code == PTP_FMT_IMG_BMP ||
3440 fmt_code == PTP_FMT_IMG_GIF ||
3441 fmt_code == PTP_FMT_IMG_PNG) {
3442 __update_prop_values_image(obj);
3448 static mtp_bool __append_obj_proplist(obj_proplist_t *prop_list, mtp_uint32 obj_handle,
3449 mtp_uint16 propcode, mtp_uint32 data_type, mtp_uchar *val)
3451 ptp_string_t *str = NULL;
3452 prop_quad_t *quad = NULL;
3453 ptp_array_t *arr_uint8;
3454 ptp_array_t *arr_uint16;
3455 ptp_array_t *arr_uint32;
3457 quad = (prop_quad_t *)g_malloc(sizeof(prop_quad_t));
3461 quad->obj_handle = obj_handle;
3462 quad->prop_code = propcode;
3463 quad->data_type = data_type;
3466 switch (data_type) {
3467 case PTP_DATATYPE_UINT8:
3468 case PTP_DATATYPE_INT8:
3469 quad->val_size = sizeof(mtp_uchar);
3472 case PTP_DATATYPE_UINT16:
3473 case PTP_DATATYPE_INT16:
3474 quad->val_size = sizeof(mtp_uint16);
3477 case PTP_DATATYPE_UINT32:
3478 case PTP_DATATYPE_INT32:
3479 quad->val_size = sizeof(mtp_uint32);
3482 case PTP_DATATYPE_UINT64:
3483 case PTP_DATATYPE_INT64:
3484 quad->val_size = sizeof(mtp_int64);
3487 case PTP_DATATYPE_UINT128:
3488 case PTP_DATATYPE_INT128:
3489 quad->val_size = 2 * sizeof(mtp_int64);
3492 case PTP_DATATYPE_AUINT8:
3493 case PTP_DATATYPE_AINT8:
3494 memcpy(&arr_uint8, val, sizeof(ptp_array_t *));
3495 quad->val_size = (arr_uint8 != NULL) ?
3496 _prop_get_size_ptparray(arr_uint8) : 0;
3497 quad->pval = (mtp_uchar *)arr_uint8;
3500 case PTP_DATATYPE_AUINT16:
3501 case PTP_DATATYPE_AINT16:
3502 memcpy(&arr_uint16, val, sizeof(ptp_array_t *));
3503 quad->val_size = (arr_uint16 != NULL) ?
3504 _prop_get_size_ptparray(arr_uint16) : 0;
3505 quad->pval = (mtp_uchar *)arr_uint16;
3508 case PTP_DATATYPE_AUINT32:
3509 case PTP_DATATYPE_AINT32:
3510 memcpy(&arr_uint32, val, sizeof(ptp_array_t *));
3511 quad->val_size = (arr_uint32 != NULL) ? _prop_get_size_ptparray(arr_uint32) : 0;
3512 quad->pval = (mtp_uchar *)arr_uint32;
3515 case PTP_DATATYPE_STRING:
3516 memcpy(&str, val, sizeof(ptp_string_t *));
3517 quad->val_size = (str != NULL) ? _prop_size_ptpstring(str) : 1;
3518 quad->pval = (mtp_uchar *)str;
3526 _util_add_node(&(prop_list->prop_quad_list), quad);
3530 mtp_uint32 _prop_pack_obj_proplist(obj_proplist_t *prop_list, mtp_uchar *buf,
3533 mtp_uchar *temp = buf;
3534 ptp_string_t *str = NULL;
3535 prop_quad_t *quad = NULL;
3537 slist_node_t *node = NULL;
3539 if (!buf || size < _prop_size_obj_proplist(prop_list)) {
3543 *(mtp_uint32 *) buf = prop_list->prop_quad_list.nnodes;
3544 #ifdef __BIG_ENDIAN__
3545 _util_conv_byte_order(temp, sizeof(mtp_uint32));
3546 #endif /* __BIG_ENDIAN__ */
3547 temp += sizeof(mtp_uint32);
3549 /* Pack the array elements */
3550 node = prop_list->prop_quad_list.start;
3551 for (ii = 0; ii < prop_list->prop_quad_list.nnodes; ii++) {
3552 quad = (prop_quad_t *) node->value;
3554 /* pack the fixed length members */
3555 memcpy(temp, &quad->obj_handle, sizeof(mtp_uint32));
3556 #ifdef __BIG_ENDIAN__
3557 _util_conv_byte_order(temp, sizeof(mtp_uint32));
3558 #endif /* __BIG_ENDIAN__ */
3559 temp += sizeof(mtp_uint32);
3561 memcpy(temp, &quad->prop_code, sizeof(mtp_uint16));
3562 #ifdef __BIG_ENDIAN__
3563 _util_conv_byte_order(temp, sizeof(mtp_uint32));
3564 #endif /* __BIG_ENDIAN__ */
3565 temp += sizeof(mtp_uint16);
3567 memcpy(temp, &quad->data_type, sizeof(mtp_uint16));
3568 #ifdef __BIG_ENDIAN__
3569 _util_conv_byte_order(temp, sizeof(mtp_uint32));
3570 #endif /* __BIG_ENDIAN__ */
3571 temp += sizeof(mtp_uint16);
3573 /* Pack property value */
3574 if ((quad->data_type & PTP_DATATYPE_VALUEMASK) ==
3575 PTP_DATATYPE_VALUE) {
3577 memcpy(temp, quad->pval, quad->val_size);
3578 #ifdef __BIG_ENDIAN__
3579 _util_conv_byte_order(temp, quad->val_size);
3580 #endif /* __BIG_ENDIAN__ */
3581 temp += quad->val_size;
3583 } else if (quad->data_type == PTP_DATATYPE_STRING) {
3585 str = (ptp_string_t *) quad->pval;
3587 temp += _prop_pack_ptpstring(str, temp,
3588 _prop_size_ptpstring (str));
3590 /* Put in an empty string: NumOfChars = 0; */
3593 } else if ((quad->data_type & PTP_DATATYPE_ARRAYMASK) ==
3594 PTP_DATATYPE_ARRAY) {
3596 if (quad->pval != NULL) {
3598 if (quad->val_size !=
3599 _prop_pack_ptparray((ptp_array_t *)quad->pval,
3600 temp, quad->val_size)) {
3601 return (mtp_uint32) (temp - buf);
3603 temp += quad->val_size;
3605 /* Fill in an empty array: mtp_uint32 */
3606 mtp_uint32 zero = 0;
3607 memcpy(temp, &zero, sizeof(mtp_uint32));
3608 temp += sizeof(mtp_uint32);
3613 return (mtp_uint32)(temp - buf);
3616 void _prop_destroy_obj_proplist(obj_proplist_t *prop_list)
3618 slist_node_t *node = NULL;
3619 slist_node_t *next_node = NULL;
3622 for (ii = 0, node = prop_list->prop_quad_list.start;
3623 ii < prop_list->prop_quad_list.nnodes; ii++, node = node->link) {
3624 g_free(node->value);
3627 next_node = prop_list->prop_quad_list.start;
3629 for (ii = 0; ii < prop_list->prop_quad_list.nnodes; ii++) {
3631 next_node = node->link;
3637 mtp_bool _prop_add_supp_integer_val(prop_info_t *prop_info, mtp_uint32 value)
3639 if (((prop_info->data_type & PTP_DATATYPE_VALUEMASK) !=
3640 PTP_DATATYPE_VALUE) || (prop_info->form_flag != ENUM_FORM)) {
3644 /* Create the node and append it. */
3645 _util_add_node(&(prop_info->supp_value_list), (void *)value);
3650 mtp_bool _prop_add_supp_string_val(prop_info_t *prop_info, mtp_wchar *val)
3652 ptp_string_t *str = NULL;
3655 if ((prop_info->data_type != PTP_DATATYPE_STRING) ||
3656 (prop_info->form_flag != ENUM_FORM)) {
3659 #ifndef MTP_USE_VARIABLE_PTP_STRING_MALLOC
3660 str = __alloc_ptpstring();
3661 #else /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
3662 str = __alloc_ptpstring(_util_wchar_len(val));
3663 #endif /* MTP_USE_VARIABLE_PTP_STRING_MALLOC */
3666 _prop_copy_char_to_ptpstring(str, val, WCHAR_TYPE);
3667 ret = _util_add_node(&(prop_info->supp_value_list), (void *)str);
3669 ERR("List add Fail");
3678 /* ObjectProp Functions */
3679 mtp_uint32 _prop_get_supp_obj_props(mtp_uint32 format_code,
3680 ptp_array_t *supp_props)
3683 mtp_uint32 num_default_obj_props = 0;
3686 if (_get_oma_drm_status() == TRUE) {
3687 num_default_obj_props = NUM_OBJECT_PROP_DESC_DEFAULT;
3689 num_default_obj_props = NUM_OBJECT_PROP_DESC_DEFAULT - 1;
3692 for (i = 0; i < num_default_obj_props; i++) {
3693 _prop_append_ele_ptparray(supp_props,
3694 props_list_default[i].propinfo.prop_code);
3697 switch (format_code) {
3700 for (i = 0; i < NUM_OBJECT_PROP_DESC_MP3; i++) {
3701 _prop_append_ele_ptparray(supp_props,
3702 props_list_mp3[i].propinfo.prop_code);
3706 for (i = 0; i < NUM_OBJECT_PROP_DESC_WMA; i++) {
3707 _prop_append_ele_ptparray(supp_props,
3708 props_list_wma[i].propinfo.prop_code);
3717 for (i = 0; i < NUM_OBJECT_PROP_DESC_WMV; i++) {
3718 _prop_append_ele_ptparray(supp_props,
3719 props_list_wmv[i].propinfo.prop_code);
3722 case MTP_FMT_ABSTRACT_AUDIO_ALBUM:
3723 case PTP_FMT_IMG_EXIF:
3724 case PTP_FMT_IMG_GIF:
3725 case PTP_FMT_IMG_BMP:
3726 case PTP_FMT_IMG_PNG:
3727 for (i = 0; i < NUM_OBJECT_PROP_DESC_ALBUM; i++) {
3728 _prop_append_ele_ptparray(supp_props,
3729 props_list_album[i].propinfo.prop_code);
3735 DBG("getsupp_props : format [0x%x], supported list [%d]\n",
3736 format_code, supp_props->num_ele);
3737 return supp_props->num_ele;
3740 mtp_bool _prop_build_supp_props_default(void)
3742 mtp_wchar temp[MTP_MAX_REG_STRING + 1] = { 0 };
3743 static mtp_bool initialized = FALSE;
3745 mtp_uint32 default_val;
3747 if (initialized == TRUE) {
3748 DBG("already supported list is in there. just return!!");
3753 * MTP_OBJ_PROPERTYCODE_STORAGEID (1)
3755 __init_obj_prop_desc(&(props_list_default[i]),
3756 MTP_OBJ_PROPERTYCODE_STORAGEID,
3757 PTP_DATATYPE_UINT32,
3758 PTP_PROPGETSET_GETONLY,
3760 MTP_PROP_GROUPCODE_GENERAL);
3763 _prop_set_default_integer(&(props_list_default[i].propinfo),
3764 (mtp_uchar *)&default_val);
3768 * MTP_OBJ_PROPERTYCODE_OBJECTFORMAT (2)
3770 __init_obj_prop_desc(&(props_list_default[i]),
3771 MTP_OBJ_PROPERTYCODE_OBJECTFORMAT,
3772 PTP_DATATYPE_UINT16,
3773 PTP_PROPGETSET_GETONLY,
3775 MTP_PROP_GROUPCODE_GENERAL);
3777 default_val = PTP_FMT_UNDEF;
3778 _prop_set_default_integer(&(props_list_default[i].propinfo),
3779 (mtp_uchar *)&default_val);
3783 * MTP_OBJ_PROPERTYCODE_PROTECTIONSTATUS (3)
3785 __init_obj_prop_desc(&(props_list_default[i]),
3786 MTP_OBJ_PROPERTYCODE_PROTECTIONSTATUS,
3787 PTP_DATATYPE_UINT16,
3788 PTP_PROPGETSET_GETONLY,
3790 MTP_PROP_GROUPCODE_GENERAL);
3792 default_val = PTP_PROTECTIONSTATUS_NOPROTECTION;
3793 _prop_add_supp_integer_val(&(props_list_default[i].propinfo),
3794 PTP_PROTECTIONSTATUS_NOPROTECTION);
3795 _prop_add_supp_integer_val(&(props_list_default[i].propinfo),
3796 PTP_PROTECTIONSTATUS_READONLY);
3797 _prop_add_supp_integer_val(&(props_list_default[i].propinfo),
3798 MTP_PROTECTIONSTATUS_READONLY_DATA);
3799 _prop_add_supp_integer_val(&(props_list_default[i].propinfo),
3800 (mtp_uint32)MTP_PROTECTIONSTATUS_NONTRANSFERABLE_DATA);
3801 _prop_set_default_integer(&(props_list_default[i].propinfo),
3802 (mtp_uchar *)&default_val);
3806 * MTP_OBJ_PROPERTYCODE_OBJECTSIZE (4)
3808 __init_obj_prop_desc(&(props_list_default[i]),
3809 MTP_OBJ_PROPERTYCODE_OBJECTSIZE,
3810 PTP_DATATYPE_UINT64,
3811 PTP_PROPGETSET_GETONLY,
3813 MTP_PROP_GROUPCODE_GENERAL);
3815 _prop_add_supp_integer_val(&(props_list_default[i].propinfo), 0x0);
3819 * MTP_OBJ_PROPERTYCODE_OBJECTFILENAME (5)
3821 __init_obj_prop_desc(&(props_list_default[i]),
3822 MTP_OBJ_PROPERTYCODE_OBJECTFILENAME,
3823 PTP_DATATYPE_STRING,
3824 PTP_PROPGETSET_GETSET,
3825 REGULAR_EXPRESSION_FORM,
3826 MTP_PROP_GROUPCODE_GENERAL);
3828 _util_utf8_to_utf16(temp, sizeof(temp) / WCHAR_SIZ,
3829 "[a-zA-Z!#\\$%&`\\(\\)\\-0-9@\\^_\\'\\{\\}\\~]{1,8}\\.[[a-zA-Z!#\\$%&`\\(\\)\\-0-9@\\^_\\'\\{\\}\\~]{1,3}]");
3830 _prop_set_regexp(&(props_list_default[i]), temp);
3832 _util_utf8_to_utf16(temp, sizeof(temp) / WCHAR_SIZ, "");
3833 _prop_set_default_string(&(props_list_default[i].propinfo), temp);
3837 * MTP_OBJ_PROPERTYCODE_PARENT (6)
3839 __init_obj_prop_desc(&(props_list_default[i]),
3840 MTP_OBJ_PROPERTYCODE_PARENT,
3841 PTP_DATATYPE_UINT32,
3842 PTP_PROPGETSET_GETONLY,
3844 MTP_PROP_GROUPCODE_GENERAL);
3847 _prop_set_default_integer(&(props_list_default[i].propinfo),
3848 (mtp_uchar *) &default_val);
3852 * MTP_OBJ_PROPERTYCODE_PERSISTENTGUID (7)
3854 __init_obj_prop_desc(&(props_list_default[i]),
3855 MTP_OBJ_PROPERTYCODE_PERSISTENTGUID,
3856 PTP_DATATYPE_UINT128,
3857 PTP_PROPGETSET_GETONLY,
3859 MTP_PROP_GROUPCODE_GENERAL);
3862 mtp_uchar guid[16] = { 0 };
3863 _prop_set_default_integer(&(props_list_default[i].propinfo),
3869 * MTP_OBJ_PROPERTYCODE_NONCONSUMABLE (8)
3871 __init_obj_prop_desc(&(props_list_default[i]),
3872 MTP_OBJ_PROPERTYCODE_NONCONSUMABLE,
3874 PTP_PROPGETSET_GETONLY,
3876 MTP_PROP_GROUPCODE_GENERAL);
3879 _prop_add_supp_integer_val(&(props_list_default[i].propinfo), 0x0);
3880 _prop_add_supp_integer_val(&(props_list_default[i].propinfo), 0x1);
3881 _prop_set_default_integer(&(props_list_default[i].propinfo),
3882 (mtp_uchar *)&default_val);
3886 *MTP_OBJ_PROPERTYCODE_DATEMODIFIED (9)
3888 __init_obj_prop_desc(&(props_list_default[i]),
3889 MTP_OBJ_PROPERTYCODE_DATEMODIFIED,
3890 PTP_DATATYPE_STRING,
3891 PTP_PROPGETSET_GETONLY,
3893 MTP_PROP_GROUPCODE_GENERAL);
3895 _prop_set_default_string(&(props_list_default[i].propinfo), temp);
3899 * MTP_OBJ_PROPERTYCODE_DATECREATED (10)
3901 __init_obj_prop_desc(&(props_list_default[i]),
3902 MTP_OBJ_PROPERTYCODE_DATECREATED,
3903 PTP_DATATYPE_STRING,
3904 PTP_PROPGETSET_GETONLY,
3906 MTP_PROP_GROUPCODE_GENERAL);
3908 _prop_set_default_string(&(props_list_default[i].propinfo), temp);
3912 * MTP_OBJ_PROPERTYCODE_NAME (11)
3914 __init_obj_prop_desc(&(props_list_default[i]),
3915 MTP_OBJ_PROPERTYCODE_NAME,
3916 PTP_DATATYPE_STRING,
3917 PTP_PROPGETSET_GETONLY,
3919 MTP_PROP_GROUPCODE_GENERAL);
3921 _prop_set_default_string(&(props_list_default[i].propinfo), temp);
3925 * MTP_OBJ_PROPERTYCODE_ASSOCIATIONTYPE (12)
3927 __init_obj_prop_desc(&(props_list_default[i]),
3928 MTP_OBJ_PROPERTYCODE_ASSOCIATIONTYPE,
3929 PTP_DATATYPE_UINT16,
3930 PTP_PROPGETSET_GETSET,
3932 MTP_PROP_GROUPCODE_GENERAL);
3934 default_val = PTP_ASSOCIATIONTYPE_UNDEFINED;
3935 _prop_add_supp_integer_val(&(props_list_default[i].propinfo),
3936 PTP_ASSOCIATIONTYPE_UNDEFINED);
3937 _prop_add_supp_integer_val(&(props_list_default[i].propinfo),
3938 PTP_ASSOCIATIONTYPE_FOLDER);
3939 _prop_set_default_integer(&(props_list_default[i].propinfo),
3940 (mtp_uchar *)&default_val);
3942 if (_get_oma_drm_status() == TRUE) {
3944 * MTP_OBJ_PROPERTYCODE_OMADRMSTATUS (13)
3947 __init_obj_prop_desc(&(props_list_default[i]),
3948 MTP_OBJ_PROPERTYCODE_OMADRMSTATUS,
3950 PTP_PROPGETSET_GETONLY,
3952 MTP_PROP_GROUPCODE_GENERAL);
3955 _prop_add_supp_integer_val(&(props_list_default[i].propinfo), 0);
3956 _prop_add_supp_integer_val(&(props_list_default[i].propinfo), 1);
3957 _prop_set_default_integer(&(props_list_default[i].propinfo),
3958 (mtp_uchar *)&default_val);
3966 mtp_bool _prop_build_supp_props_mp3(void)
3968 static mtp_bool initialized = FALSE;
3970 mtp_uint32 default_val;
3972 if (initialized == TRUE) {
3973 DBG("already supported list is in there. just return!!");
3977 /*Common properties 1 - 8 */
3978 __build_supported_common_props(&i, &props_list_mp3[i]);
3981 * MTP_OBJ_PROPERTYCODE_AUDIOBITRATE (9)
3983 __init_obj_prop_desc(&(props_list_mp3[i]),
3984 MTP_OBJ_PROPERTYCODE_AUDIOBITRATE,
3985 PTP_DATATYPE_UINT32,
3986 PTP_PROPGETSET_GETONLY,
3988 MTP_PROP_GROUPCODE_OBJECT);
3990 default_val = MTP_AUDIO_BITRATE_UNKNOWN;
3991 _prop_set_range_integer(&(props_list_mp3[i].propinfo),
3992 MTP_AUDIO_BITRATE_UNKNOWN, MTP_AUDIO_BITRATE_BLUERAY, 1L);
3993 _prop_set_default_integer(&(props_list_mp3[i].propinfo),
3994 (mtp_uchar *)&default_val);
3998 * MTP_OBJ_PROPERTYCODE_SAMPLERATE (10)
4000 __init_obj_prop_desc(&(props_list_mp3[i]),
4001 MTP_OBJ_PROPERTYCODE_SAMPLERATE,
4002 PTP_DATATYPE_UINT32,
4003 PTP_PROPGETSET_GETONLY,
4005 MTP_PROP_GROUPCODE_OBJECT);
4007 default_val = MTP_AUDIO_SAMPLERATE_UNKNOWN;
4008 _prop_set_range_integer(&(props_list_mp3[i].propinfo),
4009 MTP_AUDIO_SAMPLERATE_8K, MTP_AUDIO_SAMPLERATE_48K, 1L);
4010 _prop_set_default_integer(&(props_list_mp3[i].propinfo),
4011 (mtp_uchar *)&default_val);
4015 * MTP_OBJ_PROPERTYCODE_NUMBEROFCHANNELS (11)
4017 __init_obj_prop_desc(&(props_list_mp3[i]),
4018 MTP_OBJ_PROPERTYCODE_NUMBEROFCHANNELS,
4019 PTP_DATATYPE_UINT16,
4020 PTP_PROPGETSET_GETONLY,
4022 MTP_PROP_GROUPCODE_OBJECT);
4024 default_val = MTP_CHANNELS_MONO;
4025 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4026 MTP_CHANNELS_NOT_USED);
4027 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4029 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4030 MTP_CHANNELS_STEREO);
4031 _prop_set_default_integer(&(props_list_mp3[i].propinfo),
4032 (mtp_uchar *)&default_val);
4036 * MTP_OBJ_PROPERTYCODE_AUDIOWAVECODEC (12)
4038 __init_obj_prop_desc(&(props_list_mp3[i]),
4039 MTP_OBJ_PROPERTYCODE_AUDIOWAVECODEC,
4040 PTP_DATATYPE_UINT32,
4041 PTP_PROPGETSET_GETONLY,
4043 MTP_PROP_GROUPCODE_OBJECT);
4045 default_val = MTP_WAVEFORMAT_UNKNOWN;
4046 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4047 MTP_WAVEFORMAT_UNKNOWN);
4048 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4049 MTP_WAVEFORMAT_PCM);
4050 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4051 MTP_WAVEFORMAT_ADPCM);
4052 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4053 MTP_WAVEFORMAT_IEEEFLOAT);
4054 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4055 MTP_WAVEFORMAT_DTS);
4056 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4057 MTP_WAVEFORMAT_DRM);
4058 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4059 MTP_WAVEFORMAT_WMSP2);
4060 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4061 MTP_WAVEFORMAT_GSM610);
4062 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4063 MTP_WAVEFORMAT_MSNAUDIO);
4064 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4065 MTP_WAVEFORMAT_MPEG);
4066 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4067 MTP_WAVEFORMAT_MPEGLAYER3);
4068 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4069 MTP_WAVEFORMAT_MSAUDIO1);
4070 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4071 MTP_WAVEFORMAT_MSAUDIO2);
4072 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4073 MTP_WAVEFORMAT_MSAUDIO3);
4074 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4075 MTP_WAVEFORMAT_WMAUDIOLOSSLESS);
4076 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4077 MTP_WAVEFORMAT_WMASPDIF);
4078 _prop_add_supp_integer_val(&(props_list_mp3[i].propinfo),
4079 MTP_WAVEFORMAT_AAC);
4080 _prop_set_default_integer(&(props_list_mp3[i].propinfo),
4081 (mtp_uchar *)&default_val);
4085 * MTP_OBJ_PROPERTYCODE_DESCRIPTION (13)
4087 __init_obj_prop_desc(&(props_list_mp3[i]),
4088 MTP_OBJ_PROPERTYCODE_DESCRIPTION,
4089 PTP_DATATYPE_AUINT16,
4090 PTP_PROPGETSET_GETONLY,
4092 MTP_PROP_GROUPCODE_GENERAL);
4094 _prop_set_maxlen(&(props_list_mp3[i]), MAX_PTP_STRING_CHARS);
4095 _prop_set_default_array(&(props_list_mp3[i].propinfo), NULL, 0);
4099 * MTP_OBJ_PROPERTYCODE_COPYRIGHTINFO (14)
4101 __init_obj_prop_desc(&(props_list_mp3[i]),
4102 MTP_OBJ_PROPERTYCODE_COPYRIGHTINFO,
4103 PTP_DATATYPE_AUINT16,
4104 PTP_PROPGETSET_GETONLY,
4106 MTP_PROP_GROUPCODE_GENERAL);
4108 _prop_set_maxlen(&(props_list_mp3[i]), MAX_PTP_STRING_CHARS);
4109 _prop_set_default_array(&(props_list_mp3[i].propinfo), NULL, 0);
4115 mtp_bool _prop_build_supp_props_wma(void)
4117 static mtp_bool initialized = FALSE;
4119 mtp_uint32 default_val;
4121 if (initialized == TRUE) {
4122 DBG("already supported list is in there. just return!!");
4126 /*Common properties 1 - 8 */
4127 __build_supported_common_props(&i, &props_list_wma[i]);
4129 * MTP_OBJ_PROPERTYCODE_AUDIOBITRATE (9)
4131 __init_obj_prop_desc(&(props_list_wma[i]),
4132 MTP_OBJ_PROPERTYCODE_AUDIOBITRATE,
4133 PTP_DATATYPE_UINT32,
4134 PTP_PROPGETSET_GETONLY,
4136 MTP_PROP_GROUPCODE_OBJECT);
4138 default_val = MTP_AUDIO_BITRATE_UNKNOWN;
4139 _prop_set_range_integer(&(props_list_wma[i].propinfo),
4140 MTP_AUDIO_BITRATE_UNKNOWN, MTP_AUDIO_BITRATE_BLUERAY, 1L);
4141 _prop_set_default_integer(&(props_list_wma[i].propinfo),
4142 (mtp_uchar *)&default_val);
4146 * MTP_OBJ_PROPERTYCODE_SAMPLERATE (10)
4148 __init_obj_prop_desc(&(props_list_wma[i]),
4149 MTP_OBJ_PROPERTYCODE_SAMPLERATE,
4150 PTP_DATATYPE_UINT32,
4151 PTP_PROPGETSET_GETONLY,
4153 MTP_PROP_GROUPCODE_OBJECT);
4155 default_val = MTP_AUDIO_SAMPLERATE_UNKNOWN;
4156 _prop_set_range_integer(&(props_list_wma[i].propinfo),
4157 MTP_AUDIO_SAMPLERATE_8K, MTP_AUDIO_SAMPLERATE_48K, 1L);
4158 _prop_set_default_integer(&(props_list_wma[i]).propinfo,
4159 (mtp_uchar *)&default_val);
4163 * MTP_OBJ_PROPERTYCODE_NUMBEROFCHANNELS (11)
4165 __init_obj_prop_desc(&(props_list_wma[i]),
4166 MTP_OBJ_PROPERTYCODE_NUMBEROFCHANNELS,
4167 PTP_DATATYPE_UINT16,
4168 PTP_PROPGETSET_GETONLY,
4170 MTP_PROP_GROUPCODE_OBJECT);
4172 default_val = MTP_CHANNELS_MONO;
4173 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4174 MTP_CHANNELS_NOT_USED);
4175 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4177 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4178 MTP_CHANNELS_STEREO);
4179 _prop_set_default_integer(&(props_list_wma[i].propinfo),
4180 (mtp_uchar *)&default_val);
4184 * MTP_OBJ_PROPERTYCODE_AUDIOWAVECODEC (12)
4186 __init_obj_prop_desc(&(props_list_wma[i]),
4187 MTP_OBJ_PROPERTYCODE_AUDIOWAVECODEC,
4188 PTP_DATATYPE_UINT32,
4189 PTP_PROPGETSET_GETONLY,
4191 MTP_PROP_GROUPCODE_OBJECT);
4193 default_val = MTP_WAVEFORMAT_UNKNOWN;
4194 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4195 MTP_WAVEFORMAT_UNKNOWN);
4196 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4197 MTP_WAVEFORMAT_PCM);
4198 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4199 MTP_WAVEFORMAT_ADPCM);
4200 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4201 MTP_WAVEFORMAT_IEEEFLOAT);
4202 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4203 MTP_WAVEFORMAT_DTS);
4204 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4205 MTP_WAVEFORMAT_DRM);
4206 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4207 MTP_WAVEFORMAT_WMSP2);
4208 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4209 MTP_WAVEFORMAT_GSM610);
4210 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4211 MTP_WAVEFORMAT_MSNAUDIO);
4212 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4213 MTP_WAVEFORMAT_MPEG);
4214 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4215 MTP_WAVEFORMAT_MPEGLAYER3);
4216 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4217 MTP_WAVEFORMAT_MSAUDIO1);
4218 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4219 MTP_WAVEFORMAT_MSAUDIO2);
4220 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4221 MTP_WAVEFORMAT_MSAUDIO3);
4222 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4223 MTP_WAVEFORMAT_WMAUDIOLOSSLESS);
4224 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4225 MTP_WAVEFORMAT_WMASPDIF);
4226 _prop_add_supp_integer_val(&(props_list_wma[i].propinfo),
4227 MTP_WAVEFORMAT_AAC);
4228 _prop_set_default_integer(&(props_list_wma[i].propinfo),
4229 (mtp_uchar *)&default_val);
4233 * MTP_OBJ_PROPERTYCODE_DESCRIPTION (13)
4235 __init_obj_prop_desc(&(props_list_wma[i]),
4236 MTP_OBJ_PROPERTYCODE_DESCRIPTION,
4237 PTP_DATATYPE_AUINT16,
4238 PTP_PROPGETSET_GETONLY,
4240 MTP_PROP_GROUPCODE_GENERAL);
4242 _prop_set_maxlen(&(props_list_wma[i]), MAX_PTP_STRING_CHARS);
4243 _prop_set_default_array(&(props_list_wma[i].propinfo), NULL, 0);
4247 * MTP_OBJ_PROPERTYCODE_COPYRIGHTINFO (14)
4249 __init_obj_prop_desc(&(props_list_wma[i]),
4250 MTP_OBJ_PROPERTYCODE_COPYRIGHTINFO,
4251 PTP_DATATYPE_AUINT16,
4252 PTP_PROPGETSET_GETONLY,
4254 MTP_PROP_GROUPCODE_GENERAL);
4256 _prop_set_maxlen(&(props_list_wma[i]), MAX_PTP_STRING_CHARS);
4257 _prop_set_default_array(&(props_list_wma[i].propinfo), NULL, 0);
4259 /*-------------------------------------------------------------
4260 * Valid Configurations for interdependent Object properties
4261 *-------------------------------------------------------------
4263 #ifdef MTP_SUPPORT_INTERDEPENDENTPROP
4265 interdep_prop_config_t *ptr_interdep_prop_cfg = NULL;
4266 obj_prop_desc_t *prop = NULL;
4267 mtp_uint32 default_val;
4269 _util_init_list(&(interdep_proplist.plist));
4271 prop = (obj_prop_desc_t *)g_malloc(sizeof(obj_prop_desc_t) * 4);
4273 ERR("prop g_malloc fail");
4276 /* Valid config. 1 for Bit Rate and Sample Rate */
4277 ptr_interdep_prop_cfg =
4278 (interdep_prop_config_t *)g_malloc(sizeof(interdep_prop_config_t));
4279 if (!ptr_interdep_prop_cfg) {
4281 ERR("ptr_interdep_prop_config g_malloc fail");
4285 _util_init_list(&(ptr_interdep_prop_cfg->propdesc_list));
4286 if (!ptr_interdep_prop_cfg) {
4290 ptr_interdep_prop_cfg->format_code = MTP_FMT_WMA;
4293 __init_obj_prop_desc(&(prop[i]),
4294 MTP_OBJ_PROPERTYCODE_TOTALBITRATE,
4295 PTP_DATATYPE_UINT32,
4296 PTP_PROPGETSET_GETONLY,
4297 RANGE_FORM, MTP_PROP_GROUPCODE_GENERAL);
4299 default_val = MTP_AUDIO_BITRATE_192K;
4300 _prop_set_range_integer(&(prop[i].propinfo),
4301 MTP_AUDIO_BITRATE_192K,
4302 MTP_AUDIO_BITRATE_256K, 1000L);
4303 _prop_set_default_integer(&(prop[i].propinfo),
4304 (mtp_uchar *)&default_val);
4305 __append_interdep_prop(ptr_interdep_prop_cfg, &(prop[i]));
4308 __init_obj_prop_desc(&(prop[i]),
4309 MTP_OBJ_PROPERTYCODE_SAMPLERATE,
4310 PTP_DATATYPE_UINT32,
4311 PTP_PROPGETSET_GETONLY,
4312 ENUM_FORM, MTP_PROP_GROUPCODE_GENERAL);
4314 _prop_add_supp_integer_val(&(prop[i].propinfo),
4315 MTP_AUDIO_SAMPLERATE_DVD);
4316 _prop_set_default_integer(&(prop[i].propinfo),
4317 (mtp_uchar *)MTP_AUDIO_SAMPLERATE_DVD);
4318 __append_interdep_prop(ptr_interdep_prop_cfg, &(prop[i]));
4321 /* Created one valid configuration */
4324 ret = _util_add_node(&(interdep_proplist.plist),
4325 (void *)ptr_interdep_prop_cfg);
4328 ERR("List add Fail");
4332 /* Valid config. 2 for Bit Rate and Sample Rate */
4333 ptr_interdep_prop_cfg =
4334 (interdep_prop_config_t *)g_malloc(sizeof(interdep_prop_config_t));
4335 if (!ptr_interdep_prop_cfg) {
4337 ERR("ptr_interdep_prop_cfg g_malloc fail");
4340 _util_init_list(&(ptr_interdep_prop_cfg->propdesc_list));
4342 if (!ptr_interdep_prop_cfg) {
4346 ptr_interdep_prop_cfg->format_code = MTP_FMT_WMA;
4348 __init_obj_prop_desc(&(prop[i]),
4349 MTP_OBJ_PROPERTYCODE_TOTALBITRATE,
4350 PTP_DATATYPE_UINT32,
4351 PTP_PROPGETSET_GETONLY,
4352 RANGE_FORM, MTP_PROP_GROUPCODE_GENERAL);
4355 _prop_set_range_integer(&(prop[i].propinfo),
4356 MTP_AUDIO_BITRATE_GSM,
4357 MTP_AUDIO_BITRATE_BLUERAY, 1L);
4358 _prop_set_default_integer(&(prop[i].propinfo),
4359 (mtp_uchar *)&default_val);
4360 __append_interdep_prop(ptr_interdep_prop_cfg, &(prop[i]));
4363 __init_obj_prop_desc(&(prop[i]),
4364 MTP_OBJ_PROPERTYCODE_SAMPLERATE,
4365 PTP_DATATYPE_UINT32,
4366 PTP_PROPGETSET_GETONLY,
4367 ENUM_FORM, MTP_PROP_GROUPCODE_GENERAL);
4369 default_val = MTP_AUDIO_SAMPLERATE_CD;
4370 _prop_add_supp_integer_val(&(prop[i].propinfo),
4371 MTP_AUDIO_SAMPLERATE_32K);
4372 _prop_add_supp_integer_val(&(prop[i].propinfo),
4373 MTP_AUDIO_SAMPLERATE_CD);
4374 _prop_set_default_integer(&(prop[i].propinfo),
4375 (mtp_uchar *)&default_val);
4376 __append_interdep_prop(ptr_interdep_prop_cfg, &(prop[i]));
4379 /* Created one valid configuration */
4380 ret = _util_add_node(&(interdep_proplist.plist),
4381 (void *)ptr_interdep_prop_cfg);
4384 ERR("List add Fail");
4389 #endif /*MTP_SUPPORT_INTERDEPENDENTPROP*/
4396 mtp_bool _prop_build_supp_props_wmv(void)
4398 static mtp_bool initialized = FALSE;
4399 mtp_wchar buff[3] = { 0 };
4401 mtp_uint32 default_val;
4403 if (initialized == TRUE) {
4404 DBG("already supported list is in there. just return!!");
4407 _util_utf8_to_utf16(buff, sizeof(buff) / WCHAR_SIZ, "");
4409 /*Common properties 1 - 8 */
4410 __build_supported_common_props(&i, &props_list_wmv[i]);
4413 * MTP_OBJ_PROPERTYCODE_WIDTH (9)
4415 __init_obj_prop_desc(&(props_list_wmv[i]),
4416 MTP_OBJ_PROPERTYCODE_WIDTH,
4417 PTP_DATATYPE_UINT32,
4418 PTP_PROPGETSET_GETONLY,
4419 RANGE_FORM, MTP_PROP_GROUPCODE_OBJECT);
4422 _prop_set_range_integer(&(props_list_wmv[i].propinfo),
4423 MTP_MIN_VIDEO_WIDTH, MTP_MAX_VIDEO_WIDTH,
4424 MTP_VIDEO_HEIGHT_WIDTH_INTERVAL);
4425 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4426 (mtp_uchar *)&default_val);
4430 * MTP_OBJ_PROPERTYCODE_HEIGHT (10)
4432 __init_obj_prop_desc(&(props_list_wmv[i]),
4433 MTP_OBJ_PROPERTYCODE_HEIGHT,
4434 PTP_DATATYPE_UINT32,
4435 PTP_PROPGETSET_GETONLY,
4436 RANGE_FORM, MTP_PROP_GROUPCODE_OBJECT);
4439 _prop_set_range_integer(&(props_list_wmv[i].propinfo),
4440 MTP_MIN_VIDEO_HEIGHT, MTP_MAX_VIDEO_HEIGHT,
4441 MTP_VIDEO_HEIGHT_WIDTH_INTERVAL);
4442 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4443 (mtp_uchar *)&default_val);
4448 * MTP_OBJ_PROPERTYCODE_SAMPLERATE (11)
4450 __init_obj_prop_desc(&(props_list_wmv[i]),
4451 MTP_OBJ_PROPERTYCODE_SAMPLERATE,
4452 PTP_DATATYPE_UINT32,
4453 PTP_PROPGETSET_GETONLY,
4454 RANGE_FORM, MTP_PROP_GROUPCODE_OBJECT);
4456 default_val = MTP_AUDIO_SAMPLERATE_8K;
4457 _prop_set_range_integer(&(props_list_wmv[i]).propinfo,
4458 MTP_AUDIO_SAMPLERATE_8K,
4459 MTP_AUDIO_SAMPLERATE_DVD, MTP_AUDIO_SAMPLE_RATE_INTERVAL);
4460 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4461 (mtp_uchar *)&default_val);
4465 * MTP_OBJ_PROPERTYCODE_NUMBEROFCHANNELS (12)
4467 __init_obj_prop_desc(&(props_list_wmv[i]),
4468 MTP_OBJ_PROPERTYCODE_NUMBEROFCHANNELS,
4469 PTP_DATATYPE_UINT16,
4470 PTP_PROPGETSET_GETONLY,
4471 ENUM_FORM, MTP_PROP_GROUPCODE_OBJECT);
4473 default_val = MTP_CHANNELS_MONO;
4474 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4475 MTP_CHANNELS_NOT_USED);
4476 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4478 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4479 MTP_CHANNELS_STEREO);
4480 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4481 (mtp_uchar *)&default_val);
4485 * MTP_OBJ_PROPERTYCODE_AUDIOWAVECODEC (13)
4487 __init_obj_prop_desc(&(props_list_wmv[i]),
4488 MTP_OBJ_PROPERTYCODE_AUDIOWAVECODEC,
4489 PTP_DATATYPE_UINT32,
4490 PTP_PROPGETSET_GETONLY,
4491 ENUM_FORM, MTP_PROP_GROUPCODE_OBJECT);
4493 default_val = MTP_WAVEFORMAT_UNKNOWN;
4494 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4495 MTP_WAVEFORMAT_UNKNOWN);
4496 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4497 MTP_WAVEFORMAT_MPEGLAYER3);
4498 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4499 MTP_WAVEFORMAT_MSAUDIO1);
4500 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4501 MTP_WAVEFORMAT_MSAUDIO2);
4502 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4503 MTP_WAVEFORMAT_PCM);
4504 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4505 MTP_WAVEFORMAT_ADPCM);
4506 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4507 MTP_WAVEFORMAT_MSAUDIO3);
4508 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4509 MTP_WAVEFORMAT_RAW_AAC1);
4510 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4511 MTP_WAVEFORMAT_MPEG_HEAAC);
4512 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4513 (mtp_uchar *)&default_val);
4517 * MTP_OBJ_PROPERTYCODE_AUDIOBITRATE (14)
4519 __init_obj_prop_desc(&(props_list_wmv[i]),
4520 MTP_OBJ_PROPERTYCODE_AUDIOBITRATE,
4521 PTP_DATATYPE_UINT32,
4522 PTP_PROPGETSET_GETONLY,
4523 RANGE_FORM, MTP_PROP_GROUPCODE_OBJECT);
4525 default_val = MTP_AUDIO_BITRATE_UNKNOWN;
4526 _prop_set_range_integer(&(props_list_wmv[i].propinfo),
4527 MTP_AUDIO_BITRATE_UNKNOWN,
4528 MTP_AUDIO_BITRATE_BLUERAY, 1L);
4529 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4530 (mtp_uchar *)&default_val);
4534 * MTP_OBJ_PROPERTYCODE_VIDEOFOURCCCODEC (15)
4536 __init_obj_prop_desc(&(props_list_wmv[i]),
4537 MTP_OBJ_PROPERTYCODE_VIDEOFOURCCCODEC,
4538 PTP_DATATYPE_UINT32,
4539 PTP_PROPGETSET_GETONLY,
4540 ENUM_FORM, MTP_PROP_GROUPCODE_OBJECT);
4542 default_val = MTP_VIDEOFOURCC_MP42;
4543 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4544 MTP_VIDEOFOURCC_UNKNOWN);
4545 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4546 MTP_VIDEOFOURCC_H263);
4547 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4548 MTP_VIDEOFOURCC_H264);
4549 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4550 MTP_VIDEOFOURCC_MP42);
4551 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4552 MTP_VIDEOFOURCC_MP43);
4553 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4554 MTP_VIDEOFOURCC_WMV1);
4555 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4556 MTP_VIDEOFOURCC_WMV2);
4557 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4558 MTP_VIDEOFOURCC_WMV3);
4559 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4560 MTP_VIDEOFOURCC_DIVX);
4561 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4562 MTP_VIDEOFOURCC_XVID);
4563 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4564 MTP_VIDEOFOURCC_M4S2);
4565 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4566 MTP_VIDEOFOURCC_MP4V);
4567 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4568 MTP_VIDEOFOURCC_AVC1);
4569 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4570 MTP_VIDEOFOURCC_h264);
4571 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4572 MTP_VIDEOFOURCC_X264);
4573 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4574 MTP_VIDEOFOURCC_N264);
4575 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4576 (mtp_uchar *)&default_val);
4580 * MTP_OBJ_PROPERTYCODE_VIDEOBITRATE (16)
4582 __init_obj_prop_desc(&(props_list_wmv[i]),
4583 MTP_OBJ_PROPERTYCODE_VIDEOBITRATE,
4584 PTP_DATATYPE_UINT32,
4585 PTP_PROPGETSET_GETONLY,
4586 RANGE_FORM, MTP_PROP_GROUPCODE_OBJECT);
4588 default_val = MTP_MIN_VIDEO_BITRATE;
4589 _prop_set_range_integer(&(props_list_wmv[i].propinfo),
4590 MTP_MIN_VIDEO_BITRATE, MTP_MAX_VIDEO_BITRATE, 1L);
4591 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4592 (mtp_uchar *)&default_val);
4596 * MTP_OBJ_PROPERTYCODE_FRAMESPER1KSECONDS (17)
4598 __init_obj_prop_desc(&(props_list_wmv[i]),
4599 MTP_OBJ_PROPERTYCODE_FRAMESPER1KSECONDS,
4600 PTP_DATATYPE_UINT32,
4601 PTP_PROPGETSET_GETONLY,
4602 RANGE_FORM, MTP_PROP_GROUPCODE_OBJECT);
4604 default_val = MTP_MIN_VIDEO_FPS;
4605 _prop_set_range_integer(&(props_list_wmv[i].propinfo), MTP_MIN_VIDEO_FPS,
4606 MTP_MAX_VIDEO_FPS, 1L);
4607 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4608 (mtp_uchar *)&default_val);
4612 * MTP_OBJ_PROPERTYCODE_DESCRIPTION (18)
4614 __init_obj_prop_desc(&(props_list_wmv[i]),
4615 MTP_OBJ_PROPERTYCODE_DESCRIPTION,
4616 PTP_DATATYPE_AUINT16,
4617 PTP_PROPGETSET_GETONLY,
4619 MTP_PROP_GROUPCODE_GENERAL);
4621 _prop_set_maxlen(&(props_list_wmv[i]), MAX_PTP_STRING_CHARS);
4622 _prop_set_default_array(&(props_list_wmv[i].propinfo), NULL, 0);
4626 * MTP_OBJ_PROPERTYCODE_COPYRIGHTINFO (19)
4628 __init_obj_prop_desc(&(props_list_wmv[i]),
4629 MTP_OBJ_PROPERTYCODE_COPYRIGHTINFO,
4630 PTP_DATATYPE_AUINT16,
4631 PTP_PROPGETSET_GETONLY,
4633 MTP_PROP_GROUPCODE_GENERAL);
4635 _prop_set_maxlen(&(props_list_wmv[i]), MAX_PTP_STRING_CHARS);
4636 _prop_set_default_array(&(props_list_wmv[i].propinfo), NULL, 0);
4640 * MTP_OBJ_PROPERTYCODE_ENCODINGPROFILE (20)
4642 __init_obj_prop_desc(&(props_list_wmv[i]),
4643 MTP_OBJ_PROPERTYCODE_ENCODINGPROFILE,
4644 PTP_DATATYPE_STRING,
4645 PTP_PROPGETSET_GETONLY,
4646 ENUM_FORM, MTP_PROP_GROUPCODE_OBJECT);
4648 _util_utf8_to_utf16(buff, sizeof(buff) / WCHAR_SIZ, "SP");
4649 _prop_add_supp_string_val(&(props_list_wmv[i].propinfo), buff);
4650 _util_utf8_to_utf16(buff, sizeof(buff) / WCHAR_SIZ, "MP");
4651 _prop_add_supp_string_val(&(props_list_wmv[i].propinfo), buff);
4652 _util_utf8_to_utf16(buff, sizeof(buff) / WCHAR_SIZ, "SP");
4653 _prop_set_default_string(&(props_list_wmv[i].propinfo), buff);
4657 * MTP_OBJ_PROPERTYCODE_METAGENRE (21)
4659 __init_obj_prop_desc(&(props_list_wmv[i]),
4660 MTP_OBJ_PROPERTYCODE_METAGENRE,
4661 PTP_DATATYPE_UINT16,
4662 PTP_PROPGETSET_GETONLY,
4663 ENUM_FORM, MTP_PROP_GROUPCODE_OBJECT);
4665 default_val = MTP_METAGENRE_NOT_USED;
4666 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4667 MTP_METAGENRE_NOT_USED);
4668 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4669 MTP_METAGENRE_GENERIC_MUSIC_AUDIO_FILE);
4670 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4671 MTP_METAGENRE_GENERIC_NONMUSIC_AUDIO_FILE);
4672 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4673 MTP_METAGENRE_SPOKEN_WORD_AUDIO_BOOK_FILES);
4674 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4675 MTP_METAGENRE_SPOKEN_WORD_NONAUDIO_BOOK_FILES);
4676 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4677 MTP_METAGENRE_SPOKEN_WORD_NEWS);
4678 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4679 MTP_METAGENRE_GENERIC_VIDEO_FILE);
4680 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4681 MTP_METAGENRE_NEWS_VIDEO_FILE);
4682 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4683 MTP_METAGENRE_MUSIC_VIDEO_FILE);
4684 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4685 MTP_METAGENRE_HOME_VIDEO_FILE);
4686 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4687 MTP_METAGENRE_FEATURE_FILM_VIDEO_FILE);
4688 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4689 MTP_METAGENRE_TV_SHOW_VIDEO_FILE);
4690 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4691 MTP_METAGENRE_TRAINING_VIDEO_FILE);
4692 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4693 MTP_METAGENRE_PHOTO_MONTAGE_VIDEO_FILE);
4694 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4695 MTP_METAGENRE_GENERIC_NONAUDIO_NONVIDEO_FILE);
4696 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4697 MTP_METAGENRE_AUDIO_MEDIA_CAST_FILE);
4698 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4699 MTP_METAGENRE_VIDEO_MEDIA_CAST_FILE);
4700 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4701 (mtp_uchar *)&default_val);
4705 * MTP_OBJ_PROPERTYCODE_SCANTYPE (22)
4707 __init_obj_prop_desc(&(props_list_wmv[i]),
4708 MTP_OBJ_PROPERTYCODE_SCANTYPE,
4709 PTP_DATATYPE_UINT16,
4710 PTP_PROPGETSET_GETONLY,
4711 ENUM_FORM, MTP_PROP_GROUPCODE_OBJECT);
4713 default_val = MTP_SCANTYPE_NOT_USED;
4714 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4715 MTP_SCANTYPE_NOT_USED);
4716 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4717 MTP_SCANTYPE_PROGESSIVE);
4718 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4719 MTP_SCANTYPE_FIELDINTERLEAVEDUPPERFIRST);
4720 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4721 MTP_SCANTYPE_FIELDINTERLEAVEDLOWERFIRST);
4722 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4723 MTP_SCANTYPE_FIELDSINGLEUPPERFIRST);
4724 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4725 MTP_SCANTYPE_FIELDSINGLELOWERFIRST);
4726 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4727 MTP_SCANTYPE_MIXEDINTERLACE);
4728 _prop_add_supp_integer_val(&(props_list_wmv[i].propinfo),
4729 MTP_SCANTYPE_MIXEDINTERLACEANDPROGRESSIVE);
4730 _prop_set_default_integer(&(props_list_wmv[i].propinfo),
4731 (mtp_uchar *)&default_val);
4733 #ifdef MTP_SUPPORT_PROPERTY_SAMPLE
4734 __build_supported_sample_props(&i, &props_list_wmv[i]);
4735 #endif /*MTP_SUPPORT_PROPERTY_SAMPLE*/
4742 mtp_bool _prop_build_supp_props_album(void)
4744 static mtp_bool initialized = FALSE;
4746 mtp_uint32 default_val;
4748 if (initialized == TRUE) {
4749 DBG("already supported list is in there. just return!!");
4754 * MTP_OBJ_PROPERTYCODE_WIDTH (1)
4756 __init_obj_prop_desc(&(props_list_album[i]),
4757 MTP_OBJ_PROPERTYCODE_WIDTH,
4758 PTP_DATATYPE_UINT32,
4759 PTP_PROPGETSET_GETONLY,
4760 RANGE_FORM, MTP_PROP_GROUPCODE_OBJECT);
4763 _prop_set_range_integer(&(props_list_album[i].propinfo), 0,
4764 MTP_MAX_IMG_WIDTH, 1L);
4765 _prop_set_default_integer(&(props_list_album[i].propinfo),
4766 (mtp_uchar *)&default_val);
4770 * MTP_OBJ_PROPERTYCODE_HEIGHT (2)
4772 __init_obj_prop_desc(&(props_list_album[i]),
4773 MTP_OBJ_PROPERTYCODE_HEIGHT,
4774 PTP_DATATYPE_UINT32,
4775 PTP_PROPGETSET_GETONLY,
4776 RANGE_FORM, MTP_PROP_GROUPCODE_OBJECT);
4779 _prop_set_range_integer(&(props_list_album[i].propinfo), 0,
4780 MTP_MAX_IMG_HEIGHT, 1L);
4781 _prop_set_default_integer(&(props_list_album[i].propinfo),
4782 (mtp_uchar *)&default_val);
4785 * SAMPLE PROPERTIES (3-8)
4787 #ifdef MTP_SUPPORT_PROPERTY_SAMPLE
4789 __build_supported_sample_props(&i, &props_list_album[i]);
4790 #endif /*MTP_SUPPORT_PROPERTY_SAMPLE*/
4797 void _prop_destroy_supp_obj_props(void)
4800 int num_default_obj_prps = 0;
4802 for (i = 0; i < NUM_OBJECT_PROP_DESC_MP3; i++) {
4803 __destroy_obj_prop_desc(&(props_list_mp3[i]));
4806 for (i = 0; i < NUM_OBJECT_PROP_DESC_WMA; i++) {
4807 __destroy_obj_prop_desc(&(props_list_wma[i]));
4810 for (i = 0; i < NUM_OBJECT_PROP_DESC_WMV; i++) {
4811 __destroy_obj_prop_desc(&(props_list_wmv[i]));
4814 for (i = 0; i < NUM_OBJECT_PROP_DESC_ALBUM; i++) {
4815 __destroy_obj_prop_desc(&(props_list_album[i]));
4818 if (_get_oma_drm_status() == TRUE) {
4819 num_default_obj_prps = NUM_OBJECT_PROP_DESC_DEFAULT;
4821 num_default_obj_prps = NUM_OBJECT_PROP_DESC_DEFAULT - 1;
4824 for (i = 0; i < num_default_obj_prps; i++) {
4825 __destroy_obj_prop_desc(&(props_list_default[i]));
4830 #ifdef MTP_SUPPORT_INTERDEPENDENTPROP
4831 static mtp_bool __append_interdep_prop(interdep_prop_config_t *prop_config,
4832 obj_prop_desc_t *prop)
4836 ret = _util_add_node(&(prop_config->propdesc_list),
4839 ERR("list add Fail");
4846 #endif /* MTP_SUPPORT_INTERDEPENDENTPROP */
4848 mtp_uint32 _prop_get_size_interdep_prop(interdep_prop_config_t *prop_config)
4850 obj_prop_desc_t *prop = NULL;
4853 mtp_uint32 size = sizeof(mtp_uint32);
4855 node = prop_config->propdesc_list.start;
4856 for (ii = 0; ii < prop_config->propdesc_list.nnodes; ii++) {
4859 size += _prop_size_obj_prop_desc(prop);
4865 mtp_uint32 _prop_pack_interdep_prop(interdep_prop_config_t *prop_config,
4866 mtp_uchar *buf, mtp_uint32 size)
4868 mtp_uchar *temp = buf;
4869 obj_prop_desc_t *prop = NULL;
4871 mtp_uint32 ele_size = 0;
4874 if (!buf || size < _prop_get_size_interdep_prop(prop_config)) {
4878 *(mtp_uint32 *) buf = prop_config->propdesc_list.nnodes;
4879 #ifdef __BIG_ENDIAN__
4880 _util_conv_byte_order(buf, sizeof(mtp_uint32));
4881 #endif /* __BIG_ENDIAN__ */
4882 temp += sizeof(mtp_uint32);
4884 node = prop_config->propdesc_list.start;
4885 for (ii = 0; ii < prop_config->propdesc_list.nnodes; ii++) {
4889 ele_size = _prop_size_obj_prop_desc(prop);
4890 _prop_pack_obj_prop_desc(prop, temp, ele_size);
4895 return (mtp_uint32)(temp - buf);
4898 static mtp_uint32 __count_interdep_proplist(obj_interdep_proplist_t *config_list,
4899 mtp_uint32 format_code)
4901 mtp_uint32 count = 0;
4902 interdep_prop_config_t *prop_config = NULL;
4906 node = config_list->plist.start;
4908 for (ii = 0; ii < config_list->plist.nnodes; ii++) {
4909 prop_config = node->value;
4910 if ((prop_config->format_code == format_code) ||
4911 (prop_config->format_code == PTP_FORMATCODE_NOTUSED)) {
4918 mtp_uint32 _prop_get_size_interdep_proplist(obj_interdep_proplist_t *config_list,
4919 mtp_uint32 format_code)
4921 mtp_uint32 size = sizeof(mtp_uint32);
4922 interdep_prop_config_t *prop_config = NULL;
4926 node = config_list->plist.start;
4928 for (ii = 0; ii < config_list->plist.nnodes; ii++) {
4929 prop_config = node->value;
4930 if ((prop_config->format_code == format_code) ||
4931 (prop_config->format_code == PTP_FORMATCODE_NOTUSED)) {
4933 size += _prop_get_size_interdep_prop(prop_config);
4939 mtp_uint32 _prop_pack_interdep_proplist(obj_interdep_proplist_t *config_list,
4940 mtp_uint32 format_code, mtp_uchar *buf, mtp_uint32 size)
4942 mtp_uchar *temp = buf;
4943 interdep_prop_config_t *prop_config = NULL;
4946 mtp_uint32 ele_size = 0;
4949 size < _prop_get_size_interdep_proplist(config_list, format_code)) {
4953 *(mtp_uint32 *)buf = __count_interdep_proplist(config_list,
4955 #ifdef __BIG_ENDIAN__
4956 _util_conv_byte_order(buf, sizeof(mtp_uint32));
4957 #endif /* __BIG_ENDIAN__ */
4958 temp += sizeof(mtp_uint32);
4960 node = config_list->plist.start;
4962 for (ii = 0; ii < config_list->plist.nnodes; ii++) {
4964 prop_config = node->value;
4965 if ((prop_config->format_code == format_code) ||
4966 (prop_config->format_code == PTP_FORMATCODE_NOTUSED)) {
4968 ele_size = _prop_get_size_interdep_prop(prop_config);
4969 _prop_pack_interdep_prop(prop_config, temp, ele_size);
4974 return (mtp_uint32)(temp - buf);
4977 mtp_bool _get_oma_drm_status(void)
4979 #ifdef MTP_SUPPORT_OMADRM_EXTENSION
4981 #else /* MTP_SUPPORT_OMADRM_EXTENSION */
4983 #endif /* MTP_SUPPORT_OMADRM_EXTENSION */