Fix double free
[platform/core/connectivity/mtp-responder.git] / include / entity / mtp_property.h
1 /*
2  * Copyright (c) 2012, 2013 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 #ifndef _MTP_PROPERTY_H_
18 #define _MTP_PROPERTY_H_
19
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23
24 #include "mtp_list.h"
25 #include "mtp_object.h"
26
27 #define MAX_SIZE_IN_BYTES_OF_PROP_VALUE         16000
28 #define ELEMENT_NOT_FOUND                       -1
29 #define INITIAL_ARRAY_SIZE                      100
30 #define NUM_OBJECT_PROP_DESC                    38
31 #define NUM_OBJECT_PROP_DESC_DEFAULT            13
32 #define NUM_OBJECT_PROP_DESC_MP3                14
33 #define NUM_OBJECT_PROP_DESC_WMA                14
34 #define MTP_HEAP_CAL_INTERVAL                   100
35
36 #ifdef MTP_SUPPORT_PROPERTY_SAMPLE
37 #define NUM_OBJECT_PROP_DESC_WMV                28
38 #else /* MTP_SUPPORT_PROPERTY_SAMPLE */
39 #define NUM_OBJECT_PROP_DESC_WMV                22
40 #endif /* MTP_SUPPORT_PROPERTY_SAMPLE */
41
42 #ifdef MTP_SUPPORT_PROPERTY_SAMPLE
43 #define NUM_OBJECT_PROP_DESC_ALBUM              8
44 #else /* MTP_SUPPORT_PROPERTY_SAMPLE */
45 #define NUM_OBJECT_PROP_DESC_ALBUM              2
46 #endif /* MTP_SUPPORT_PROPERTY_SAMPLE */
47
48 typedef struct _interdep_prop_config {
49         mtp_uint32 format_code;
50         slist_t propdesc_list;
51 } interdep_prop_config_t;
52
53 /*
54  * brief The property form flag.
55  * This enumerated type defines what kind of data the structure contains.
56  */
57 typedef enum {
58         NONE = 0x00,
59         RANGE_FORM = 0x01,
60         ENUM_FORM = 0x02,
61         DATE_TIME_FORM = 0x03,
62         REGULAR_EXPRESSION_FORM = 0x04,
63         BYTE_ARRAY_FORM = 0x05,
64         LONG_STRING_FORM = 0xFF,
65 } form_flag_t;
66
67 enum {
68         GROUP_CODE_NONE = 0x00000000,
69         GROUP_CODE_SYNC_PROPS = 0x00000001,
70         GROUP_CODE_UI_PROPS = 0x00000002,
71         GROUP_CODE_OBJ_Info = 0x00000004,
72         GROUP_CODE_OFTEN_USED = 0x00000008,
73         GROUP_CODE_SUPPLEMENTAL = 0x00000100,
74         GROUP_CODE_UNKNOWN_PROP = 0x00010000,
75         GROUP_CODE_SLOW = 0x00FF0000,
76         GROUP_CODE_ALL = 0xFFFFFFFF
77 };
78
79 #define MTP_PROP_GROUPCODE_GENERAL      GROUP_CODE_OFTEN_USED
80 #define MTP_PROP_GROUPCODE_OBJECT       GROUP_CODE_OFTEN_USED
81 #define MTP_PROP_GROUPCODE_ALBUMART     GROUP_CODE_OFTEN_USED
82
83 #define node_alloc_and_append()\
84         do {\
85                 mtp_bool ret;\
86                 ret = _util_add_node(&(obj->propval_list), (void *)prop_val);\
87                 if (FALSE == ret) {\
88                         _prop_destroy_obj_propval(prop_val);\
89                         ERR("_util_add_node() Fail");\
90                         return (FALSE);\
91                 } \
92         } while (0);
93
94 #define propvalue_alloc_and_check(prop_val)\
95         do {\
96                 prop_val = _prop_alloc_obj_propval(prop);\
97                 if (prop_val == NULL) {\
98                         ERR("prop_val == NULL");\
99                         return (FALSE);\
100                 } \
101         } while (0);
102
103 #define init_default_value(value)\
104         do {\
105                 memset(&default_val, 0, sizeof(default_val));\
106                 default_val = value;\
107         } while (0);
108
109 typedef struct {
110         mtp_uint32 min_val;     /* Minimum value */
111         mtp_uint32 max_val;     /* Maximum value */
112         mtp_uint32 step_size;   /* Step value */
113 } range_form_t;
114
115 /* This structure contains property info */
116 typedef struct {
117         mtp_uint16 prop_code;   /* Property code */
118         mtp_uint16 data_type;   /* type of the data */
119         mtp_uint32 dts_size;    /* Count of Byte Size of the
120                                                            Data-Type-Specific value (DTS) */
121         mtp_uchar get_set;      /* Set possible or not */
122         mtp_uchar form_flag;    /* Indicates the form of the valid values */
123         range_form_t range;     /* Range Values */
124         slist_t supp_value_list; /*Enum Values */
125         union {
126                 mtp_uchar integer[16];  /* Default value for any integer value
127                                                                    type (UINT8, mtp_uint16, mtp_uint32) */
128                 ptp_string_t *str;      /* Default value for String type */
129                 ptp_array_t *array;     /* Default array */
130         } default_val;          /* Default value */
131 } prop_info_t;
132
133 /* This structure contains device property description dataset */
134 typedef struct {
135         prop_info_t propinfo;
136         union {
137                 mtp_uchar integer[16];  /* Current value for any integer value
138                                                                    type (UINT8, mtp_uint16, mtp_uint32) */
139                 ptp_string_t *str;      /* Current value for String type */
140                 ptp_array_t *array;     /* Current value for array data type
141                                                            (AINT8, AUINT8) */
142         } current_val;                      /*Current value */
143 } device_prop_desc_t;
144
145 /* This structure contains object property description dataset */
146 typedef struct {
147         prop_info_t propinfo;
148         mtp_uint32 group_code;  /* Identifies the group of this property */
149         union {
150                 ptp_string_t *reg_exp;  /* Regular Expression Form */
151                 mtp_uint32 max_len; /* LongString Form */
152         } prop_forms;            /*Object property-specific forms */
153 } obj_prop_desc_t;
154
155 /* This structure contains current value of a object property */
156 typedef struct {
157         obj_prop_desc_t *prop;
158         union {
159                 mtp_uchar integer[16];  /* Current value for any integer */
160                 ptp_string_t *str;      /* Current value for String type */
161                 ptp_array_t *array;
162         } current_val;
163 } obj_prop_val_t;
164
165 /* This structure defines ObjectPropQuad for GetObjectPropList */
166 typedef struct {
167         mtp_uint32 obj_handle;
168         mtp_uint16 prop_code;
169         mtp_uint16 data_type;
170         mtp_uchar *pval;
171         mtp_uint32 val_size;    /* a useful helper,
172                                                            not part of the Object Property Quadruple */
173 } prop_quad_t;
174
175 /* This structure contains a list of MTP Object properties */
176 typedef struct {
177         slist_t prop_quad_list;
178 } obj_proplist_t;
179
180 /* This structure contains a list of InterdependentProperties  */
181 typedef struct {
182         slist_t plist;
183 } obj_interdep_proplist_t ;
184
185 /*
186  * Ptparray functions
187  */
188 void _prop_init_ptparray(ptp_array_t *parray, data_type_t type);
189 ptp_array_t *_prop_alloc_ptparray(data_type_t type);
190 mtp_uint32 _prop_get_size_ptparray(ptp_array_t *parray);
191 mtp_uint32 _prop_get_size_ptparray_without_elemsize(ptp_array_t *parray);
192 mtp_bool _prop_grow_ptparray(ptp_array_t *parray, mtp_uint32 new_size);
193 mtp_int32 _prop_find_ele_ptparray(ptp_array_t *parray, mtp_uint32 element);
194 mtp_bool _prop_get_ele_ptparray(ptp_array_t *parray, mtp_uint32 index, void *ele);
195 mtp_bool _prop_append_ele_ptparray(ptp_array_t *parray, mtp_uint32 element);
196 mtp_bool _prop_append_ele128_ptparray(ptp_array_t *parray, mtp_uint64 *element);
197 mtp_bool _prop_copy_ptparray(ptp_array_t *dst, ptp_array_t *src);
198 mtp_uint32 _prop_pack_ptparray(ptp_array_t *parray, mtp_uchar *buf,
199                 mtp_uint32 bufsize);
200 mtp_uint32 _prop_pack_ptparray_without_elemsize(ptp_array_t *parray,
201                 mtp_uchar *buf, mtp_uint32 bufsize);
202 mtp_bool _prop_rem_elem_ptparray(ptp_array_t *parray, mtp_uint32 element);
203 void _prop_deinit_ptparray(ptp_array_t *parray);
204 void _prop_destroy_ptparray(ptp_array_t *parray);
205
206 /*
207  * PtpString Functions
208  */
209 void _prop_init_ptpstring(ptp_string_t *pstring);
210 void _prop_init_ptptimestring(ptp_time_string_t *pstring);
211 void _prop_copy_time_to_ptptimestring(ptp_time_string_t *pString,
212                 system_time_t *sys_time);
213 void _prop_copy_ptpstring(ptp_string_t *dst, ptp_string_t *src);
214 void _prop_copy_ptptimestring(ptp_time_string_t *dst, ptp_time_string_t *src);
215 void _prop_copy_char_to_ptpstring(ptp_string_t *pstring, void *str,
216                 char_mode_t cmode);
217 mtp_uint32 _prop_size_ptpstring(ptp_string_t *pstring);
218 mtp_uint32 _prop_size_ptptimestring(ptp_time_string_t *pstring);
219 mtp_uint32 _prop_pack_ptpstring(ptp_string_t *pstring, mtp_uchar *buf,
220                 mtp_uint32 size);
221 mtp_uint32 _prop_pack_ptptimestring(ptp_time_string_t *pstring, mtp_uchar *buf,
222                 mtp_uint32 size);
223 mtp_uint32 _prop_parse_rawstring(ptp_string_t *pstring, mtp_uchar *buf,
224                 mtp_uint32 size);
225 void _prop_destroy_ptpstring(ptp_string_t *pstring);
226
227 /*
228  * DevicePropDesc Functions
229  */
230 void _prop_init_device_property_desc(device_prop_desc_t *prop,
231                 mtp_uint16 propcode, mtp_uint16 data_type, mtp_uchar get_set,
232                 mtp_uchar form_flag);
233 mtp_uint32 _prop_size_device_prop_desc(device_prop_desc_t *prop);
234 mtp_uint32 _prop_pack_device_prop_desc(device_prop_desc_t *prop,
235                 mtp_uchar *buf, mtp_uint32 size);
236 mtp_uint32 _prop_pack_curval_device_prop_desc(device_prop_desc_t *prop,
237                 mtp_uchar *buf, mtp_uint32 size);
238 void _prop_reset_device_prop_desc(device_prop_desc_t *prop);
239
240 /*
241  * ObjectPropVal Functions
242  */
243 obj_prop_val_t *_prop_alloc_obj_propval(obj_prop_desc_t *prop);
244 obj_prop_val_t *_prop_get_prop_val(mtp_obj_t *obj, mtp_uint32 prop_code);
245 mtp_uint32 _prop_pack_obj_propval(obj_prop_val_t *val, mtp_uchar *buf,
246                 mtp_uint32 size);
247 mtp_uint32 _prop_size_obj_propval(obj_prop_val_t *val);
248 void _prop_destroy_obj_propval(obj_prop_val_t *pval);
249 mtp_bool _prop_set_default_integer(prop_info_t *prop_info, mtp_uchar *value);
250 mtp_bool _prop_set_default_string(prop_info_t *prop_info, mtp_wchar *val);
251 mtp_bool _prop_set_range_integer(prop_info_t *prop_info, mtp_uint32 min,
252                 mtp_uint32 max, mtp_uint32 step);
253 mtp_bool _prop_set_maxlen(obj_prop_desc_t *prop, mtp_uint32 max);
254 mtp_bool _prop_set_default_array(prop_info_t *prop_info, mtp_uchar *parray,
255                 mtp_uint32 num_ele);
256 mtp_bool _prop_add_supp_integer_val(prop_info_t *prop_info, mtp_uint32 val);
257 mtp_bool _prop_add_supp_string_val(prop_info_t *prop_info, mtp_wchar *val);
258 mtp_bool _prop_is_valid_integer(prop_info_t *prop_info, mtp_uint64 value);
259 mtp_bool _prop_is_valid_string(prop_info_t *prop, ptp_string_t *str);
260 mtp_bool _prop_is_equal_ptpstring(ptp_string_t *dst, ptp_string_t *src);
261 mtp_bool _prop_set_current_integer(device_prop_desc_t *prop, mtp_uint32 val);
262 mtp_bool _prop_set_current_string(device_prop_desc_t *prop, ptp_string_t *str);
263 mtp_bool _prop_set_current_array(device_prop_desc_t *prop, mtp_uchar *arr);
264 mtp_bool _prop_set_current_device_prop(device_prop_desc_t *prop, mtp_uchar *val,
265                 mtp_uint32 size);
266 mtp_bool _prop_set_current_integer_val(obj_prop_val_t *propval, mtp_uint64 val);
267 mtp_bool _prop_set_current_string_val(obj_prop_val_t *propval, ptp_string_t *str);
268 mtp_bool _prop_set_current_array_val(obj_prop_val_t *propval, mtp_uchar *arr,
269                 mtp_uint32 size);
270 #ifdef __BIG_ENDIAN__
271 mtp_bool _prop_set_current_array_val_usbrawdata(obj_prop_val_t *val,
272                 mtp_uchar *arr, mtp_uint32 size);
273 #endif /* __BIG_ENDIAN__ */
274 mtp_bool _prop_set_regexp(obj_prop_desc_t *prop, mtp_wchar *regex);
275
276 /*
277  * ObjectPropDesc Functions
278  */
279 mtp_uint32 _prop_size_obj_prop_desc(obj_prop_desc_t *prop);
280 mtp_uint32 _prop_pack_obj_prop_desc(obj_prop_desc_t *prop, mtp_uchar *buf,
281                 mtp_uint32 size);
282 mtp_uint32 _prop_pack_default_val_obj_prop_desc(obj_prop_desc_t *prop,
283                 mtp_uchar *buf, mtp_uint32 size);
284 obj_prop_desc_t *_prop_get_obj_prop_desc(mtp_uint32 format_code,
285                 mtp_uint32 prop_code);
286
287 /*
288  * ObjectProplist Functions
289  */
290 mtp_bool _prop_update_property_values_list(mtp_obj_t *obj);
291 mtp_uint32 _prop_size_obj_proplist(obj_proplist_t *prop_list);
292 mtp_uint32 _prop_get_obj_proplist(mtp_obj_t *pObject, mtp_uint32 prop_code,
293                 mtp_uint32 group_code, obj_proplist_t *prop_list);
294 mtp_uint32 _prop_pack_obj_proplist(obj_proplist_t *prop_list, mtp_uchar *buf,
295                 mtp_uint32 size);
296 void _prop_destroy_obj_proplist(obj_proplist_t *prop_list);
297
298 /*
299  * ObjectProp Functions
300  */
301 mtp_uint32 _prop_get_supp_obj_props(mtp_uint32 format_code,
302                 ptp_array_t *supp_props);
303 mtp_bool _prop_build_supp_props_mp3(void);
304 mtp_bool _prop_build_supp_props_wma(void);
305 mtp_bool _prop_build_supp_props_wmv(void);
306 mtp_bool _prop_build_supp_props_album(void);
307 mtp_bool _prop_build_supp_props_default(void);
308 void _prop_destroy_supp_obj_props(void);
309
310 /*
311  *Interdependent Prop Functions
312  */
313 mtp_uint32 _prop_get_size_interdep_prop(interdep_prop_config_t *prop);
314 mtp_uint32 _prop_pack_interdep_prop(interdep_prop_config_t *prop, mtp_uchar *buf,
315                 mtp_uint32 size);
316 mtp_uint32 _prop_get_size_interdep_proplist(obj_interdep_proplist_t *config_list,
317                 mtp_uint32 format_code);
318 mtp_uint32 _prop_pack_interdep_proplist(obj_interdep_proplist_t *config_list,
319                 mtp_uint32 format_code, mtp_uchar *buf, mtp_uint32 size);
320 mtp_bool _get_oma_drm_status(void);
321
322 #ifdef __cplusplus
323 }
324 #endif
325
326 #endif /* _MTP_PROPERTY_H_ */