1 /* This test is designed to test the simple dpump host/device class operation.  */
2 
3 #include <stdio.h>
4 #include "tx_api.h"
5 #include "fx_api.h"
6 #include "ux_api.h"
7 #include "ux_system.h"
8 #include "ux_utility.h"
9 
10 #include "ux_device_class_pima.h"
11 #include "ux_host_class_pima.h"
12 
13 #include "ux_hcd_sim_host.h"
14 #include "ux_device_stack.h"
15 
16 #include "ux_test_dcd_sim_slave.h"
17 #include "ux_test_hcd_sim_host.h"
18 #include "ux_test_utility_sim.h"
19 
20 
21 /* Define constants.  */
22 #define UX_TEST_STACK_SIZE          (2*1024)
23 #define UX_TEST_MEMORY_SIZE         (512*1024)
24 
25 #define UX_TEST_RAM_DISK_SIZE       (128*1024)
26 #define UX_TEST_RAM_DISK_LAST_LBA   ((UX_TEST_RAM_DISK_SIZE / 512) - 1)
27 
28 #define UX_TEST_MAX_HANDLES                 16
29 #define UX_TEST_MAX_DATASET_HEADER          32
30 #define UX_TEST_MAX_DATASET_SIZE            1024
31 #define UX_TEST_PIMA_STORAGE_ID             1
32 #define UX_TEST_VENDOR_REQUEST              0x54
33 
34 #define UX_TEST_CUSTOM_VID                  0x0000
35 #define UX_TEST_CUSTOM_PID                  0x0000
36 
37 #define UX_TEST_AUDIO_CODEC_WAVE_FORMAT_MPEGLAYER3      0x00000055
38 #define UX_TEST_AUDIO_CODEC_WAVE_FORMAT_MPEG            0x00000050
39 #define UX_TEST_AUDIO_CODEC_WAVE_FORMAT_RAW_AAC1        0x000000FF
40 
41 
42 /* Define local/extern function prototypes.  */
43 
44 extern VOID  _fx_ram_driver(FX_MEDIA *media_ptr);
45 
46 static void        test_thread_entry(ULONG);
47 
48 static TX_THREAD   test_thread_host_simulation;
49 static TX_THREAD   test_thread_device_simulation;
50 static void        test_thread_host_simulation_entry(ULONG);
51 static void        test_thread_device_simulation_entry(ULONG);
52 
53 static VOID        test_hcd_entry_set_cfg(UX_TEST_ACTION *action, VOID *params);
54 static VOID        test_hcd_entry_interaction_request_sem_put(UX_TEST_ACTION *action, VOID *params);
55 static VOID        test_hcd_entry_interaction_invoked(UX_TEST_ACTION *action, VOID *params);
56 static VOID        test_hcd_entry_interaction_wait_transfer_disconnection(UX_TEST_ACTION *action, VOID *params);
57 
58 static VOID        test_pima_instance_activate(VOID  *pima_instance);
59 static VOID        test_pima_instance_deactivate(VOID *pima_instance);
60 
61 UINT pima_device_device_reset();
62 UINT pima_device_device_prop_desc_get(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
63                                                 ULONG device_property,
64                                                 UCHAR **device_prop_dataset,
65                                                 ULONG *device_prop_dataset_length);
66 UINT pima_device_device_prop_value_get(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
67                                                 ULONG device_property,
68                                                 UCHAR **device_prop_value,
69                                                 ULONG *device_prop_value_length);
70 UINT pima_device_device_prop_value_set(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
71                                                 ULONG device_property,
72                                                 UCHAR *device_prop_value,
73                                                 ULONG device_prop_value_length);
74 UINT pima_device_storage_format(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
75                                                 ULONG storage_id);
76 UINT pima_device_storage_info_get(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
77                                                 ULONG storage_id);
78 UINT pima_device_object_number_get(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
79                                                 ULONG object_format_code,
80                                                 ULONG object_association,
81                                                 ULONG *object_number);
82 UINT pima_device_object_handles_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
83                                                  ULONG object_handles_format_code,
84                                                  ULONG object_handles_association,
85                                                  ULONG *object_handles_array,
86                                                  ULONG object_handles_max_number);
87 UINT pima_device_object_info_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
88                                                 ULONG object_handle,
89                                                 UX_SLAVE_CLASS_PIMA_OBJECT **object);
90 UINT pima_device_object_data_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
91                                                 ULONG object_handle,
92                                                 UCHAR *object_buffer,
93                                                 ULONG object_offset,
94                                                  ULONG object_length_requested,
95                                                 ULONG *object_actual_length);
96 UINT pima_device_object_info_send (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
97                                                 UX_SLAVE_CLASS_PIMA_OBJECT *object,
98                                                 ULONG storage_id,
99                                                 ULONG parent_object_handle,
100                                                 ULONG *object_handle);
101 UINT pima_device_object_data_send (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
102                                                 ULONG object_handle,
103                                                 ULONG phase ,
104                                                 UCHAR *object_buffer,
105                                                 ULONG object_offset,
106                                                 ULONG object_length);
107 UINT pima_device_object_delete(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
108                                                 ULONG object_handle);
109 UINT pima_device_object_prop_desc_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
110                                                 ULONG object_property,
111                                                 ULONG object_format_code,
112                                                 UCHAR **object_prop_dataset,
113                                                 ULONG *object_prop_dataset_length);
114 UINT pima_device_object_prop_value_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
115                                                 ULONG object_handle,
116                                                 ULONG object_property,
117                                                 UCHAR **object_prop_value,
118                                                 ULONG *object_prop_value_length);
119 UINT pima_device_object_prop_value_set (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
120                                                 ULONG object_handle,
121                                                 ULONG object_property,
122                                                 UCHAR *object_prop_value,
123                                                 ULONG object_prop_value_length);
124 UINT pima_device_object_references_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
125                                                 ULONG object_handle,
126                                                 UCHAR **object_references_array,
127                                                 ULONG *object_references_array_length);
128 UINT pima_device_object_references_set (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
129                                                 ULONG object_handle,
130                                                 UCHAR *object_references_array,
131                                                 ULONG object_references_array_length);
132 UINT pima_device_object_handle_check(ULONG object_handle,
133                                                 UX_SLAVE_CLASS_PIMA_OBJECT **object,
134                                                 ULONG *caller_handle_index);
135 UINT pima_device_device_class_custom_entry(UX_SLAVE_CLASS_COMMAND *command);
136 UINT pima_device_vendor_request(ULONG request, ULONG request_value, ULONG request_index, ULONG request_length,
137                                                UCHAR *transfer_request_buffer,
138                                                    ULONG *transfer_request_length);
139 
140 
141 /* Define global data structures.  */
142 static UCHAR                               usbx_memory[UX_TEST_MEMORY_SIZE + (UX_TEST_STACK_SIZE * 2)];
143 
144 static UX_SLAVE_CLASS_PIMA_DEVICE          *pima_device;
145 static UX_SLAVE_CLASS_PIMA_PARAMETER       pima_device_parameter;
146 
147 static UX_HOST_CLASS_PIMA                  *pima_host;
148 static UX_HOST_CLASS_PIMA_SESSION          pima_host_session;
149 static UX_HOST_CLASS_PIMA_DEVICE           pima_host_device;
150 static UX_HOST_CLASS_PIMA_OBJECT           pima_host_object;
151 
152 static ULONG                               host_buffer[4096];
153 static UCHAR                               *host_buffer8 =  (UCHAR  *)host_buffer;
154 static USHORT                              *host_buffer16 = (USHORT *)host_buffer;
155 static ULONG                               *host_buffer32 = (ULONG  *)host_buffer;
156 
157 static FX_MEDIA                            ram_disk;
158 static CHAR                                ram_disk_memory[UX_TEST_RAM_DISK_SIZE];
159 static CHAR                                ram_disk_buffer[2048];
160 
161 
162 static ULONG                               error_counter;
163 
164 static ULONG                               set_cfg_counter;
165 
166 static ULONG                               rsc_mem_free_on_set_cfg;
167 static ULONG                               rsc_sem_on_set_cfg;
168 static ULONG                               rsc_sem_get_on_set_cfg;
169 static ULONG                               rsc_mutex_on_set_cfg;
170 
171 static ULONG                               rsc_enum_sem_usage;
172 static ULONG                               rsc_enum_sem_get_count;
173 static ULONG                               rsc_enum_mutex_usage;
174 static ULONG                               rsc_enum_mem_usage;
175 
176 static ULONG                               rsc_cdc_sem_usage;
177 static ULONG                               rsc_cdc_sem_get_count;
178 static ULONG                               rsc_cdc_mutex_usage;
179 static ULONG                               rsc_cdc_mem_usage;
180 
181 static ULONG                               interaction_count;
182 
183 static UCHAR                               error_callback_ignore = UX_TRUE;
184 static ULONG                               error_callback_counter;
185 
186 
187 /* Structure of the Object property dataset.  This is specific to the local device. */
188 typedef struct TEST_PIMA_OBJECT_PROP_DATASET_STRUCT
189 {
190     ULONG                        test_pima_object_prop_dataset_storage_id;
191     ULONG                        test_pima_object_prop_dataset_object_format;
192     ULONG                        test_pima_object_prop_dataset_protection_status;
193     ULONG                        test_pima_object_prop_dataset_object_size_low;
194     ULONG                        test_pima_object_prop_dataset_object_size_high;
195     UCHAR                        test_pima_object_prop_dataset_object_file_name[128];
196     ULONG                        test_pima_object_prop_dataset_parent_object;
197     ULONG                        test_pima_object_prop_dataset_persistent_unique_object_identifier[4];
198     UCHAR                        test_pima_object_prop_dataset_name[128];
199     UCHAR                        test_pima_object_prop_dataset_non_consumable;
200     UCHAR                        test_pima_object_prop_dataset_artist[128];
201     ULONG                        test_pima_object_prop_dataset_track;
202     ULONG                        test_pima_object_prop_dataset_use_count;
203     UCHAR                        test_pima_object_prop_dataset_date_authored[16];
204     UCHAR                        test_pima_object_prop_dataset_genre[128];
205     UCHAR                        test_pima_object_prop_dataset_album_name[128];
206     UCHAR                        test_pima_object_prop_dataset_album_artist[128];
207     ULONG                        test_pima_object_prop_dataset_sample_rate;
208     ULONG                        test_pima_object_prop_dataset_number_of_channels;
209     ULONG                        test_pima_object_prop_dataset_audio_wave_codec;
210     ULONG                        test_pima_object_prop_dataset_audio_bitrate;
211     ULONG                        test_pima_object_prop_dataset_duration;
212     ULONG                        test_pima_object_prop_dataset_width;
213     ULONG                        test_pima_object_prop_dataset_height;
214     ULONG                        test_pima_object_prop_dataset_scan_type;
215     ULONG                        test_pima_object_prop_dataset_fourcc_codec;
216     ULONG                        test_pima_object_prop_dataset_video_bitrate;
217     ULONG                        test_pima_object_prop_dataset_frames_per_thousand_seconds;
218     ULONG                        test_pima_object_prop_dataset_keyframe_distance;
219     UCHAR                        test_pima_object_prop_dataset_encoding_profile[128];
220 
221 } TEST_PIMA_PROP_DATASET;
222 
223 
224 /* Define device framework.  */
225 
226 UCHAR device_framework_full_speed[] = {
227 
228     /* Device descriptor */
229         0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x08,
230         0xE8, 0x04, 0xC5, 0x68, 0x00, 0x00, 0x01, 0x02,
231         0x03, 0x01,
232 
233     /* Configuration descriptor */
234         0x09, 0x02, 0x27, 0x00, 0x01, 0x01, 0x00, 0xc0,
235         0x32,
236 
237     /* Interface descriptor */
238         0x09, 0x04, 0x00, 0x00, 0x03, 0x06, 0x01, 0x01,
239         0x00,
240 
241     /* Endpoint descriptor (Bulk In) */
242         0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x00,
243 
244     /* Endpoint descriptor (Bulk Out) */
245         0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00,
246 
247     /* Endpoint descriptor (Interrupt In) */
248         0x07, 0x05, 0x83, 0x03, 0x40, 0x00, 0x04
249 };
250 #define DEVICE_FRAMEWORK_LENGTH_FULL_SPEED sizeof(device_framework_full_speed)
251 
252 UCHAR device_framework_high_speed[] = {
253 
254     /* Device descriptor */
255         0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40,
256         0xE8, 0x04, 0xC5, 0x68, 0x01, 0x00, 0x01, 0x02,
257         0x03, 0x01,
258 
259     /* Device qualifier descriptor */
260         0x0a, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40,
261         0x01, 0x00,
262 
263     /* Configuration descriptor */
264         0x09, 0x02, 0x27, 0x00, 0x01, 0x01, 0x00, 0xc0,
265         0x32,
266 
267     /* Interface descriptor */
268         0x09, 0x04, 0x00, 0x00, 0x03, 0x06, 0x01, 0x01,
269         0x00,
270 
271     /* Endpoint descriptor (Bulk In) */
272         0x07, 0x05, 0x81, 0x02, 0x00, 0x02, 0x00,
273 
274     /* Endpoint descriptor (Bulk Out) */
275         0x07, 0x05, 0x02, 0x02, 0x00, 0x02, 0x00,
276 
277     /* Endpoint descriptor (Interrupt In) */
278         0x07, 0x05, 0x83, 0x03, 0x40, 0x00, 0x04
279 };
280 #define DEVICE_FRAMEWORK_LENGTH_HIGH_SPEED sizeof(device_framework_high_speed)
281 
282 /* String Device Framework :
283     Byte 0 and 1 : Word containing the language ID : 0x0904 for US    or 0x0000 for none.
284     Byte 2       : Byte containing the index of the descriptor
285     Byte 3       : Byte containing the length of the descriptor string
286 
287     The last string entry can be the optional Microsoft String descriptor.
288 */
289 UCHAR string_framework[] = {
290 
291     /* Manufacturer string descriptor : Index 1 */
292         0x09, 0x04, 0x01, 0x0c,
293         0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x20, 0x4c,
294         0x6f, 0x67, 0x69, 0x63,
295 
296     /* Product string descriptor : Index 2 */
297         0x09, 0x04, 0x02, 0x0a,
298         0x4d, 0x54, 0x50, 0x20, 0x70, 0x6c, 0x61, 0x79,
299         0x65, 0x72,
300 
301     /* Serial Number string descriptor : Index 3 */
302         0x09, 0x04, 0x03, 0x04,
303         0x30, 0x30, 0x30, 0x31,
304 
305     /* Microsoft OS string descriptor : Index 0xEE. String is MSFT100.
306        The last byte is the vendor code used to filter Vendor specific commands.
307        The vendor commands will be executed in the class.
308        This code can be anything but must not be 0x66 or 0x67 which are PIMA class commands.  */
309         0x00, 0x00, 0xEE, 0x08,
310         0x4D, 0x53, 0x46, 0x54,
311         0x31, 0x30, 0x30,
312         UX_TEST_VENDOR_REQUEST
313 
314 };
315 #define STRING_FRAMEWORK_LENGTH sizeof(string_framework)
316 
317 /* Multiple languages are supported on the device, to add
318     a language besides english, the unicode language code must
319     be appended to the language_id_framework array and the length
320     adjusted accordingly. */
321 UCHAR language_id_framework[] = {
322 
323     /* English. */
324         0x09, 0x04
325 };
326 #define LANGUAGE_ID_FRAMEWORK_LENGTH sizeof(language_id_framework)
327 
328 
329 /* Define PIMA supported device properties. The last entry MUST be a zero. The DeviceInfoSet command
330    will parse this array and compute the number of functions supported and return it to the
331    host.  For each declared device property, a dataset must be created in the application.  */
332 USHORT pima_device_prop_supported[] =   {
333 
334     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_UNDEFINED,                                         */
335     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_BATTERY_LEVEL,                                     */
336     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_FUNCTIONALMODE,                                    */
337     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_IMAGE_SIZE,                                        */
338     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_COMPRESSION_SETTING,                               */
339     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_WHITE_BALANCE,                                     */
340     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_RGB_GAIN,                                          */
341     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_F_NUMBER,                                          */
342     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_FOCAL_LENGTH,                                      */
343     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_FOCUS_DISTANCE,                                    */
344     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_FOCUS_MODE,                                        */
345     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_EXPOSURE_METERING_MODE,                            */
346     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_FLASH_MODE,                                        */
347     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_EXPOSURE_TIME,                                     */
348     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_EXPOSURE_PROGRAM_MODE,                             */
349     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_EXPOSURE_INDEX,                                    */
350     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_EXPOSURE_BIAS_COMPENSATION,                        */
351     UX_DEVICE_CLASS_PIMA_DEV_PROP_DATE_TIME,
352     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_CAPTURE_DELAY,                                     */
353     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_STILL_CAPTURE_MODE,                                */
354     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_CONTRAST,                                          */
355     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_SHARPNESS,                                         */
356     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_DIGITAL_ZOOM,                                      */
357     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_EFFECT_MODE,                                       */
358     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_BURST_NUMBER,                                      */
359     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_BURST_INTERVAL,                                    */
360     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_TIME_LAPSE_NUMBER,                                 */
361     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_TIME_LAPSE_INTERVAL,                               */
362     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_FOCUS_METERING_MODE,                               */
363     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_UPLOAD_URL,                                        */
364     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_ARTIST,                                            */
365     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_COPYRIGHT_INFO,                                    */
366 #ifdef UX_PIMA_WITH_MTP_SUPPORT
367     UX_DEVICE_CLASS_PIMA_DEV_PROP_SYNCHRONIZATION_PARTNER,
368     UX_DEVICE_CLASS_PIMA_DEV_PROP_DEVICE_FRIENDLY_NAME,
369     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_VOLUME,                                            */
370     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_SUPPORTED_FORMATS_ORDERED,                         */
371     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_DEVICE_ICON,                                       */
372     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_PLAYBACK_RATE,                                     */
373     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_PLAYBACK_OBJECT,                                   */
374     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_PLAYBACK_CONTAINER,                                */
375     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_SESSION_INITIATOR_VERSION_INFO,                    */
376     /*UX_DEVICE_CLASS_PIMA_DEV_PROP_PERCEIVED_DEVICE_TYPE,                             */
377 #endif
378     0
379 };
380 
381 /* Define PIMA supported capture formats. The last entry MUST be a zero. The DeviceInfoSet command
382    will parse this array and compute the number of functions supported and return it to the
383    host.  */
384 USHORT pima_device_supported_capture_formats[] =       {
385     0
386 };
387 
388 /* Define PIMA supported image formats. The last entry MUST be a zero. The DeviceInfoSet command
389    will parse this array and compute the number of formats supported and return it to the
390    host.  */
391 USHORT pima_device_supported_image_formats[] =        {
392     UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED,
393     UX_DEVICE_CLASS_PIMA_OFC_ASSOCIATION,
394     /*UX_DEVICE_CLASS_PIMA_OFC_SCRIPT,                                                  */
395     /*UX_DEVICE_CLASS_PIMA_OFC_EXECUTABLE,                                              */
396     /*UX_DEVICE_CLASS_PIMA_OFC_TEXT,                                                    */
397     /*UX_DEVICE_CLASS_PIMA_OFC_HTML,                                                    */
398     /*UX_DEVICE_CLASS_PIMA_OFC_DPOF,                                                    */
399     /*UX_DEVICE_CLASS_PIMA_OFC_AIFF,                                                    */
400     /*UX_DEVICE_CLASS_PIMA_OFC_WAV,*/
401     UX_DEVICE_CLASS_PIMA_OFC_MP3,
402     /*UX_DEVICE_CLASS_PIMA_OFC_AVI,                                                     */
403     /*UX_DEVICE_CLASS_PIMA_OFC_MPEG,                                                    */
404     UX_DEVICE_CLASS_PIMA_OFC_ASF,
405     /*UX_DEVICE_CLASS_PIMA_OFC_DEFINED,                                                 */
406     /*UX_DEVICE_CLASS_PIMA_OFC_EXIF_JPEG,                                               */
407     /*UX_DEVICE_CLASS_PIMA_OFC_TIFF_EP,                                                 */
408     /*UX_DEVICE_CLASS_PIMA_OFC_FLASHPIX,                                                */
409     /*UX_DEVICE_CLASS_PIMA_OFC_BMP,                                                     */
410     /*UX_DEVICE_CLASS_PIMA_OFC_CIFF,                                                    */
411     /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED,                                               */
412     /*UX_DEVICE_CLASS_PIMA_OFC_GIF,                                                     */
413     /*UX_DEVICE_CLASS_PIMA_OFC_JFIF,                                                    */
414     /*UX_DEVICE_CLASS_PIMA_OFC_CD,                                                      */
415     /*UX_DEVICE_CLASS_PIMA_OFC_PICT,                                                    */
416     /*UX_DEVICE_CLASS_PIMA_OFC_PNG,                                                     */
417     /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED,                                               */
418     /*UX_DEVICE_CLASS_PIMA_OFC_TIFF,                                                    */
419     /*UX_DEVICE_CLASS_PIMA_OFC_TIFF_IT,                                                 */
420     /*UX_DEVICE_CLASS_PIMA_OFC_JP2,                                                     */
421     /*UX_DEVICE_CLASS_PIMA_OFC_JPX,                                                     */
422 #ifdef UX_PIMA_WITH_MTP_SUPPORT
423     /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_FIRMWARE,                                      */
424     /*UX_DEVICE_CLASS_PIMA_OFC_WINDOWS_IMAGE_FORMAT,                                    */
425     /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_AUDIO,                                         */
426     UX_DEVICE_CLASS_PIMA_OFC_WMA,
427     /*UX_DEVICE_CLASS_PIMA_OFC_OGG,                                                     */
428     /*UX_DEVICE_CLASS_PIMA_OFC_AAC,                                                     */
429     /*UX_DEVICE_CLASS_PIMA_OFC_AUDIBLE,                                                 */
430     /*UX_DEVICE_CLASS_PIMA_OFC_FLAC,                                                    */
431     /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_VIDEO,                                         */
432     UX_DEVICE_CLASS_PIMA_OFC_WMV,
433     /*UX_DEVICE_CLASS_PIMA_OFC_MP4_CONTAINER,                                           */
434     /*UX_DEVICE_CLASS_PIMA_OFC_MP2,                                                     */
435     /*UX_DEVICE_CLASS_PIMA_OFC_3GP_CONTAINER,                                           */
436     /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_COLLECTION,                                    */
437     /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_MULTIMEDIA_ALBUM,                               */
438     /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_IMAGE_ALBUM,                                    */
439     UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_AUDIO_ALBUM,
440     /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_VIDEO_ALBUM,                                    */
441     UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_AUDIO_AND_VIDEO_PLAYLIST,
442     /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_CONTACT_GROUP,                                  */
443     /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_MESSAGE_FOLDER,                                 */
444     /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_CHAPTERED_PRODUCTION,                           */
445     /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_AUDIO_PLAYLIST,                                 */
446     /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_VIDEO_PLAYLIST,                                 */
447     /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_MEDIACAST,                                      */
448     /*UX_DEVICE_CLASS_PIMA_OFC_WPL_PLAYLIST,                                            */
449     /*UX_DEVICE_CLASS_PIMA_OFC_M3U_PLAYLIST,                                            */
450     /*UX_DEVICE_CLASS_PIMA_OFC_MPL_PLAYLIST,                                            */
451     /*UX_DEVICE_CLASS_PIMA_OFC_ASX_PLAYLIST,                                            */
452     /*UX_DEVICE_CLASS_PIMA_OFC_PLS_PLAYLIST,                                            */
453     /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_DOCUMENT,                                      */
454     /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_DOCUMENT,                                       */
455     /*UX_DEVICE_CLASS_PIMA_OFC_XML_DOCUMENT,                                            */
456     /*UX_DEVICE_CLASS_PIMA_OFC_MICROSOFT_WORD_DOCUMENT,                                 */
457     /*UX_DEVICE_CLASS_PIMA_OFC_MHT_COMPILED_HTML_DOCUMENT,                              */
458     /*UX_DEVICE_CLASS_PIMA_OFC_MICROSOFT_EXCEL_SPREADSHEET,                             */
459     /*UX_DEVICE_CLASS_PIMA_OFC_MICROSOFT_POWERPOINT_PRESENTATION,                       */
460     /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_MESSAGE,                                       */
461     /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_MESSAGE,                                        */
462     /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_CONTACT,                                       */
463     /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_CONTACT,                                        */
464     /*UX_DEVICE_CLASS_PIMA_OFC_VCARD2,                                                  */
465 #endif
466     0
467 };
468 
469 /* Device property dataset. Here we give the example of the Date/Time dataset.  */
470 UCHAR pima_device_prop_date_time_dataset[] = {
471 
472     /* Device prop code : Date/Time.  */
473         0x11, 0x50,                                            /* Prop code */
474         0xff, 0xff,                                            /* String    */
475         0x01,                                                  /* GET/SET   */
476         0x00,                                                  /* Default value : empty string.  */
477         0x10,                                                  /* Current value : length of the unicode string.  */
478         0x31, 0x00, 0x39, 0x00, 0x38, 0x00,    0x30, 0x00,     /* YYYY */
479         0x30, 0x00, 0x31, 0x00,                                /* MM */
480         0x30, 0x00, 0x31, 0x00,                                /* DD */
481         0x54, 0x00,                                            /* T  */
482         0x30, 0x00, 0x30, 0x00,                                /* HH */
483         0x30, 0x00, 0x30, 0x00,                                /* MM */
484         0x30, 0x00, 0x30, 0x00,                                /* SS */
485         0x00, 0x00,                                            /* Unicode terminator.  */
486         0x00                                                   /* Form Flag : None.  */
487 };
488 #define DEVICE_PROP_DATE_TIME_DATASET_LENGTH sizeof(pima_device_prop_date_time_dataset) /* 40 */
489 
490 /* Device property dataset. Here we give the example of the synchronization partner dataset.  */
491 UCHAR pima_device_prop_synchronization_partner_dataset[] = {
492 
493     /* Device prop code : Synchronization Partner.  */
494         0x01, 0xD4,                                            /* Prop code */
495         0xff, 0xff,                                            /* String    */
496         0x01,                                                  /* GET/SET   */
497         0x00,                                                  /* Default value : empty string.  */
498         0x00,                                                  /* Current value : empty string.  */
499         0x00                                                   /* Form Flag : None.  */
500 };
501 #define DEVICE_PROP_SYNCHRONIZATION_PARTNER_DATASET_LENGTH sizeof(pima_device_prop_synchronization_partner_dataset) /* 8 */
502 
503 /* Device property dataset. Here we give the example of the device friendly name dataset.  */
504 UCHAR pima_device_prop_device_friendly_name_dataset[] = {
505 
506     /* Device prop code : Device Friendly Name.  */
507         0x02, 0xD4,                                            /* Prop code */
508         0xff, 0xff,                                            /* String    */
509         0x01,                                                  /* GET/SET   */
510         0x0E,                                                  /* Default value.  Length of Unicode string. */
511         0x45, 0x00, 0x4C, 0x00, 0x20, 0x00, 0x4D, 0x00,        /* Unicode string.  */
512         0x54, 0x00, 0x50, 0x00, 0x20, 0x00, 0x44, 0x00,
513         0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00,
514         0x65, 0x00,
515         0x00, 0x00,                                            /* Unicode terminator. */
516         0x0E,                                                  /* Current value.  Length of Unicode string. */
517         0x45, 0x00, 0x4C, 0x00, 0x20, 0x00, 0x4D, 0x00,
518         0x54, 0x00, 0x50, 0x00, 0x20, 0x00, 0x44, 0x00,
519         0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00,        /* Unicode terminator.  */
520         0x65, 0x00,
521         0x00, 0x00,                                            /* Unicode terminator.  */
522         0x00                                                   /* Form Flag : None.  */
523 };
524 #define DEVICE_PROP_DEVICE_FRIENDLY_NAME_DATASET_LENGTH sizeof(pima_device_prop_device_friendly_name_dataset) /* 64 */
525 
526 /* Object property supported.
527  WORD 0      : Object Format Code
528  WORD 1      : Number of Prop codes for this Object format
529  WORD n      : Prop Codes
530  WORD n+2    : Next Object Format code ....
531 
532  This array is in whatever endinaness of the system and will be translated
533  by the PTP class in little endian.
534 
535 */
536 USHORT pima_device_object_prop_supported[] = {
537 
538         /* Object format code : Undefined.  */
539         UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED,
540 
541         /* NUmber of objects supported for this format.  */
542         9,
543         /* Mandatory objects for all formats.  */
544         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID,
545         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT,
546         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS,
547         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE,
548         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME,
549         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT,
550         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER,
551         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME,
552         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE,
553 
554         /* Object format code : Association.  */
555         UX_DEVICE_CLASS_PIMA_OFC_ASSOCIATION,
556 
557         /* NUmber of objects supported for this format.  */
558         9,
559         /* Mandatory objects for all formats.  */
560         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID,
561         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT,
562         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS,
563         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE,
564         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME,
565         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT,
566         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER,
567         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME,
568         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE,
569 
570         /* Object format code : Advanced System Format.  */
571         UX_DEVICE_CLASS_PIMA_OFC_ASF,
572 
573         /* NUmber of objects supported for this format.  */
574         9,
575         /* Mandatory objects for all formats.  */
576         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID,
577         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT,
578         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS,
579         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE,
580         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME,
581         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT,
582         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER,
583         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME,
584         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE,
585 
586         /* Object format code : Audio Clip.  */
587         UX_DEVICE_CLASS_PIMA_OFC_MP3,
588 
589         /* NUmber of objects supported for this format.  */
590         20,
591         /* Mandatory objects for all formats.  */
592         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID,
593         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT,
594         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS,
595         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE,
596         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME,
597         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT,
598         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER,
599         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME,
600         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE,
601 
602         /* Mandatory objects for all audio objects.  */
603         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ARTIST,
604            UX_DEVICE_CLASS_PIMA_OBJECT_PROP_TRACK,
605         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DATE_AUTHORED,
606         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE,
607            UX_DEVICE_CLASS_PIMA_OBJECT_PROP_USE_COUNT,
608         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_NAME,
609            UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_ARTIST,
610         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SAMPLE_RATE,
611            UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NUMBER_OF_CHANNELS,
612            UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_WAVE_CODEC,
613         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_BITRATE,
614 
615         /* Object format code : Windows Media Audio Clip.  */
616         UX_DEVICE_CLASS_PIMA_OFC_WMA,
617 
618         /* NUmber of objects supported for this format.  */
619         20,
620         /* Mandatory objects for all formats.  */
621         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID,
622         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT,
623         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS,
624         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE,
625         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME,
626         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT,
627         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER,
628         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME,
629         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE,
630 
631         /* Mandatory objects for all audio objects.  */
632         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ARTIST,
633            UX_DEVICE_CLASS_PIMA_OBJECT_PROP_TRACK,
634         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DATE_AUTHORED,
635         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE,
636            UX_DEVICE_CLASS_PIMA_OBJECT_PROP_USE_COUNT,
637         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_NAME,
638            UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_ARTIST,
639         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SAMPLE_RATE,
640            UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NUMBER_OF_CHANNELS,
641            UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_WAVE_CODEC,
642         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_BITRATE,
643 
644         /* Object format code : Windows Media Video.  */
645         UX_DEVICE_CLASS_PIMA_OFC_WMV,
646 
647         /* NUmber of objects supported for this format.  */
648         24,
649         /* Mandatory objects for all formats.  */
650         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID,
651         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT,
652         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS,
653         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE,
654         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME,
655         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT,
656         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER,
657         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME,
658         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE,
659 
660         /* Mandatory objects for all video objects.  */
661         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_WIDTH,
662         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_HEIGHT,
663         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DATE_AUTHORED,
664         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE,
665            UX_DEVICE_CLASS_PIMA_OBJECT_PROP_USE_COUNT,
666         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SAMPLE_RATE,
667            UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NUMBER_OF_CHANNELS,
668         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SCAN_TYPE,
669            UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_WAVE_CODEC,
670         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_BITRATE,
671         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VIDEO_FOURCC_CODEC,
672         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VIDEO_BITRATE,
673         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_FRAMES_PER_THOUSAND_SECONDS,
674         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_KEYFRAME_DISTANCE,
675         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ENCODING_PROFILE,
676 
677         /* Object format code : Abstract Audio Album.  */
678         UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_AUDIO_ALBUM,
679         2,
680         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE,
681            UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_ARTIST,
682 
683         /* Object format code : Abstract Audio and Video Playlist.  */
684         UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_AUDIO_AND_VIDEO_PLAYLIST,
685         2,
686         UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE,
687            UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_ARTIST,
688 
689         0
690 };
691 
692 /* PIMA MTP names ... */
693 UCHAR pima_device_info_vendor_name[]  =      "Microsoft AzureRTOS";
694 UCHAR pima_device_info_product_name[] =      "AzureRTOS MTP Device";
695 UCHAR pima_device_info_serial_no[]    =      "1.1.1.1";
696 UCHAR pima_device_info_version[]      =      "V1.0";
697 
698 /* PIMA MTP storage names.  */
699 UCHAR pima_parameter_volume_description[]        =   "MTP Client Storage Volume";
700 UCHAR pima_parameter_volume_label[]              =   "MTP Client Storage Label";
701 
702 /* Array of handles for the demo.  */
703 ULONG                                            pima_device_object_number_handles;
704 ULONG                                            pima_device_object_number_handles_array[UX_TEST_MAX_HANDLES];
705 UX_SLAVE_CLASS_PIMA_OBJECT                       pima_device_object_info_array[UX_TEST_MAX_HANDLES];
706 FX_FILE                                          pima_device_object_filex_array[UX_TEST_MAX_HANDLES];
707 TEST_PIMA_PROP_DATASET                           pima_device_object_property_array[UX_TEST_MAX_HANDLES];
708 
709 /* Local storage for one Object property. This is a temporary storage to create
710    the demanded dataset.  The size of the dataset depends on the type and number of object properties. */
711 UCHAR    pima_device_object_property_dataset_data_buffer        [UX_TEST_MAX_DATASET_SIZE];
712 
713 /* This is a 128 bit unique identifier. For the demo we make it 32 bits only as it is easier to manipulate.  */
714 ULONG    pima_device_object_persistent_unique_identifier        = 1;
715 
716 
717 /* Prototype for test control return.  */
718 
719 void  test_control_return(UINT status);
720 
error_callback(UINT system_level,UINT system_context,UINT error_code)721 static VOID error_callback(UINT system_level, UINT system_context, UINT error_code)
722 {
723 
724     error_callback_counter ++;
725 
726     if (!error_callback_ignore)
727     {
728         {
729             /* Failed test.  */
730             printf("Error #%d, system_level: %d, system_context: %d, error_code: 0x%x\n", __LINE__, system_level, system_context, error_code);
731             test_control_return(1);
732         }
733     }
734 }
735 
sleep_break_on_error(VOID)736 static UINT  sleep_break_on_error(VOID)
737 {
738 
739     if (error_callback_counter >= 3)
740         return error_callback_counter;
741 
742     return UX_SUCCESS;
743 }
744 
745 /* Define the ISR dispatch routine.  */
746 
test_isr(void)747 static void    test_isr(void)
748 {
749 
750     /* For further expansion of interrupt-level testing.  */
751 }
752 
753 
754 
test_system_host_change_function(ULONG event,UX_HOST_CLASS * cls,VOID * inst)755 static UINT test_system_host_change_function(ULONG event, UX_HOST_CLASS *cls, VOID *inst)
756 {
757     // printf("hChg:%lx, %p, %p\n", event, cls, inst);
758     switch(event)
759     {
760         case UX_DEVICE_INSERTION:
761             if (cls->ux_host_class_entry_function == ux_host_class_pima_entry)
762             {
763                 pima_host = (UX_HOST_CLASS_PIMA *)inst;
764             }
765             break;
766 
767         case UX_DEVICE_REMOVAL:
768             if (cls->ux_host_class_entry_function == ux_host_class_pima_entry)
769             {
770                 if ((VOID*)pima_host == inst)
771                     pima_host = UX_NULL;
772             }
773             break;
774 
775         default:
776             break;
777     }
778     return 0;
779 }
780 
test_pima_instance_activate(VOID * instance)781 static VOID    test_pima_instance_activate(VOID *instance)
782 {
783     pima_device = (UX_SLAVE_CLASS_PIMA_DEVICE *)instance;
784 }
test_pima_instance_deactivate(VOID * instance)785 static VOID    test_pima_instance_deactivate(VOID *instance)
786 {
787     if ((VOID *)pima_device == instance)
788         pima_device = UX_NULL;
789 }
790 
791 
792 /* Define what the initial system looks like.  */
793 
794 #ifdef CTEST
test_application_define(void * first_unused_memory)795 void test_application_define(void *first_unused_memory)
796 #else
797 void    usbx_pima_basic_test_application_define(void *first_unused_memory)
798 #endif
799 {
800 
801 UINT                    status;
802 CHAR *                  stack_pointer;
803 CHAR *                  memory_pointer;
804 ULONG                   test_n;
805 
806     /* Inform user.  */
807     printf("Running PIMA Basic Functionality Test............................... ");
808 
809     /* Reset testing counts. */
810     ux_test_utility_sim_mutex_create_count_reset();
811     ux_test_utility_sim_sem_create_count_reset();
812     ux_test_utility_sim_sem_get_count_reset();
813     /* Reset error generations */
814     ux_test_utility_sim_sem_error_generation_stop();
815     ux_test_utility_sim_mutex_error_generation_stop();
816     ux_test_utility_sim_sem_get_error_generation_stop();
817 
818     ux_utility_memory_set(ram_disk_memory, 0, UX_TEST_RAM_DISK_SIZE);
819     fx_system_initialize();
820     status = fx_media_format(&ram_disk, _fx_ram_driver, ram_disk_memory, ram_disk_buffer, 512, "RAM DISK", 2, 512, 0, (UX_TEST_RAM_DISK_SIZE / 512), 512, 4, 1, 1);
821     if (status != UX_SUCCESS)
822     {
823         printf("ERROR #%d\n", __LINE__);
824         test_control_return(1);
825     }
826     status = fx_media_open(&ram_disk, "RAM DISK", _fx_ram_driver, ram_disk_memory, ram_disk_buffer, 512);
827     if (status != UX_SUCCESS)
828     {
829         printf("ERROR #%d\n", __LINE__);
830         test_control_return(1);
831     }
832 
833     /* Initialize the free memory pointer */
834     stack_pointer = (CHAR *) usbx_memory;
835     memory_pointer = stack_pointer + (UX_TEST_STACK_SIZE * 2);
836 
837     /* Initialize USBX Memory */
838     status = ux_system_initialize(memory_pointer, UX_TEST_MEMORY_SIZE, UX_NULL,0);
839     if (status != UX_SUCCESS)
840     {
841         printf("ERROR #%d\n", __LINE__);
842         test_control_return(1);
843     }
844 
845     /* Register the error callback. */
846     _ux_utility_error_callback_register(error_callback);
847 
848     /* The code below is required for installing the host portion of USBX */
849     status =  ux_host_stack_initialize(test_system_host_change_function);
850     if (status != UX_SUCCESS)
851     {
852         printf("ERROR #%d\n", __LINE__);
853         test_control_return(1);
854     }
855 
856     /* Register PIMA class.  */
857     status =  ux_host_stack_class_register(_ux_system_host_class_pima_name, ux_host_class_pima_entry);
858     if (status != UX_SUCCESS)
859     {
860         printf("ERROR #%d\n", __LINE__);
861         test_control_return(1);
862     }
863 
864     /* The code below is required for installing the device portion of USBX. No call back for
865        device status change in this example. */
866     status =  ux_device_stack_initialize(device_framework_high_speed, DEVICE_FRAMEWORK_LENGTH_HIGH_SPEED,
867                                        device_framework_full_speed, DEVICE_FRAMEWORK_LENGTH_FULL_SPEED,
868                                        string_framework, STRING_FRAMEWORK_LENGTH,
869                                        language_id_framework, LANGUAGE_ID_FRAMEWORK_LENGTH,UX_NULL);
870     if (status != UX_SUCCESS)
871     {
872         printf("ERROR #%d\n", __LINE__);
873         test_control_return(1);
874     }
875 
876     /* MTP requires MTP extensions.  */
877     status = _ux_device_stack_microsoft_extension_register(UX_TEST_VENDOR_REQUEST, pima_device_vendor_request);
878     if (status != UX_SUCCESS)
879     {
880         printf("ERROR #%d\n", __LINE__);
881         test_control_return(1);
882     }
883 
884     /* Set the parameters for PIMA device.  */
885     pima_device_parameter.ux_device_class_pima_instance_activate   =  test_pima_instance_activate;
886     pima_device_parameter.ux_device_class_pima_instance_deactivate =  test_pima_instance_deactivate;
887 
888     /* Initialize the pima device parameter.  */
889     pima_device_parameter.ux_device_class_pima_parameter_manufacturer                  = pima_device_info_vendor_name;
890     pima_device_parameter.ux_device_class_pima_parameter_model                         = pima_device_info_product_name;
891     pima_device_parameter.ux_device_class_pima_parameter_device_version                = pima_device_info_version;
892     pima_device_parameter.ux_device_class_pima_parameter_serial_number                 = pima_device_info_serial_no;
893     pima_device_parameter.ux_device_class_pima_parameter_storage_id                    = UX_TEST_PIMA_STORAGE_ID;
894     pima_device_parameter.ux_device_class_pima_parameter_storage_type                  = UX_DEVICE_CLASS_PIMA_STC_FIXED_RAM;
895     pima_device_parameter.ux_device_class_pima_parameter_storage_file_system_type      = UX_DEVICE_CLASS_PIMA_FSTC_GENERIC_FLAT;
896     pima_device_parameter.ux_device_class_pima_parameter_storage_access_capability     = UX_DEVICE_CLASS_PIMA_AC_READ_WRITE;
897     pima_device_parameter.ux_device_class_pima_parameter_storage_max_capacity_low      = ram_disk.fx_media_total_clusters * ram_disk.fx_media_sectors_per_cluster * ram_disk.fx_media_bytes_per_sector;
898     pima_device_parameter.ux_device_class_pima_parameter_storage_max_capacity_high     = 0;
899     pima_device_parameter.ux_device_class_pima_parameter_storage_free_space_low        = ram_disk.fx_media_available_clusters * ram_disk.fx_media_sectors_per_cluster * ram_disk.fx_media_bytes_per_sector;
900     pima_device_parameter.ux_device_class_pima_parameter_storage_free_space_high       = 0;
901     pima_device_parameter.ux_device_class_pima_parameter_storage_free_space_image      = 0xFFFFFFFF;
902     pima_device_parameter.ux_device_class_pima_parameter_storage_description           = pima_parameter_volume_description;
903     pima_device_parameter.ux_device_class_pima_parameter_storage_volume_label          = pima_parameter_volume_label;
904     pima_device_parameter.ux_device_class_pima_parameter_device_properties_list        = pima_device_prop_supported;
905     pima_device_parameter.ux_device_class_pima_parameter_supported_capture_formats_list= pima_device_supported_capture_formats;
906     pima_device_parameter.ux_device_class_pima_parameter_supported_image_formats_list  = pima_device_supported_image_formats;
907     pima_device_parameter.ux_device_class_pima_parameter_object_properties_list        = pima_device_object_prop_supported;
908 
909     /* Define the callbacks.  */
910     pima_device_parameter.ux_device_class_pima_parameter_device_reset                  = pima_device_device_reset;
911     pima_device_parameter.ux_device_class_pima_parameter_device_prop_desc_get          = pima_device_device_prop_desc_get;
912     pima_device_parameter.ux_device_class_pima_parameter_device_prop_value_get         = pima_device_device_prop_value_get;
913     pima_device_parameter.ux_device_class_pima_parameter_device_prop_value_set         = pima_device_device_prop_value_set;
914     pima_device_parameter.ux_device_class_pima_parameter_storage_format                = pima_device_storage_format;
915     pima_device_parameter.ux_device_class_pima_parameter_storage_info_get              = pima_device_storage_info_get;
916     pima_device_parameter.ux_device_class_pima_parameter_object_number_get             = pima_device_object_number_get;
917     pima_device_parameter.ux_device_class_pima_parameter_object_handles_get            = pima_device_object_handles_get;
918     pima_device_parameter.ux_device_class_pima_parameter_object_info_get               = pima_device_object_info_get;
919     pima_device_parameter.ux_device_class_pima_parameter_object_data_get               = pima_device_object_data_get;
920     pima_device_parameter.ux_device_class_pima_parameter_object_info_send              = pima_device_object_info_send;
921     pima_device_parameter.ux_device_class_pima_parameter_object_data_send              = pima_device_object_data_send;
922     pima_device_parameter.ux_device_class_pima_parameter_object_delete                 = pima_device_object_delete;
923     pima_device_parameter.ux_device_class_pima_parameter_object_prop_desc_get          = pima_device_object_prop_desc_get;
924     pima_device_parameter.ux_device_class_pima_parameter_object_prop_value_get         = pima_device_object_prop_value_get;
925     pima_device_parameter.ux_device_class_pima_parameter_object_prop_value_set         = pima_device_object_prop_value_set;
926     pima_device_parameter.ux_device_class_pima_parameter_object_references_get         = pima_device_object_references_get;
927     pima_device_parameter.ux_device_class_pima_parameter_object_references_set         = pima_device_object_references_set;
928 
929     /* Store the instance owner.  */
930     pima_device_parameter.ux_device_class_pima_parameter_application                   = (VOID *) 0;
931 
932     /* Initialize the device PIMA class.  */
933     status =  ux_device_stack_class_register(_ux_system_slave_class_pima_name, ux_device_class_pima_entry,
934                                              1, 0, &pima_device_parameter);
935     if (status != UX_SUCCESS)
936     {
937         printf("ERROR #%d\n", __LINE__);
938         test_control_return(1);
939     }
940 
941     /* Initialize the simulated device controller.  */
942     status =  _ux_dcd_sim_slave_initialize();
943     if (status != UX_SUCCESS)
944     {
945         printf("ERROR #%d\n", __LINE__);
946         test_control_return(1);
947     }
948 
949     /* Register all the USB host controllers available in this system */
950     status =  ux_host_stack_hcd_register(_ux_system_host_hcd_simulator_name, _ux_test_hcd_sim_host_initialize,0,0);
951     if (status != UX_SUCCESS)
952     {
953         printf("ERROR #%d\n", __LINE__);
954         test_control_return(1);
955     }
956 
957     /* Create the main host simulation thread.  */
958     status =  tx_thread_create(&test_thread_host_simulation, "tx demo host simulation", test_thread_host_simulation_entry, 0,
959             stack_pointer, UX_TEST_STACK_SIZE,
960             20, 20, 1, TX_AUTO_START);
961     if (status != UX_SUCCESS)
962     {
963         printf("ERROR #%d\n", __LINE__);
964         test_control_return(1);
965     }
966 
967     /* Create the main slave simulation  thread.  */
968     status =  tx_thread_create(&test_thread_device_simulation, "tx demo device simulation", test_thread_device_simulation_entry, 0,
969             stack_pointer + UX_TEST_STACK_SIZE, UX_TEST_STACK_SIZE,
970             20, 20, 1, TX_AUTO_START);
971     if (status != UX_SUCCESS)
972     {
973         printf("ERROR #%d\n", __LINE__);
974         test_control_return(1);
975     }
976 }
977 
test_call_pima_apis(void)978 static void test_call_pima_apis(void)
979 {
980 UINT  status;
981 ULONG actual_length;
982 
983     status = ux_host_class_pima_device_info_get(pima_host, &pima_host_device);
984     UX_TEST_CHECK_SUCCESS(status);
985 
986     status = ux_host_class_pima_session_open(pima_host, &pima_host_session);
987     UX_TEST_CHECK_SUCCESS(status);
988 
989     status = ux_host_class_pima_storage_ids_get(pima_host, &pima_host_session, host_buffer32, 64);
990     UX_TEST_CHECK_SUCCESS(status);
991 
992     status = ux_host_class_pima_num_objects_get(pima_host, &pima_host_session, 0, UX_HOST_CLASS_PIMA_OFC_UNDEFINED);
993     UX_TEST_CHECK_SUCCESS(status);
994 
995     status = ux_host_class_pima_object_handles_get(pima_host, &pima_host_session, host_buffer32, 64, 0, UX_HOST_CLASS_PIMA_OFC_UNDEFINED, 0);
996     UX_TEST_CHECK_SUCCESS(status);
997 
998     status = ux_host_class_pima_object_info_get(pima_host, &pima_host_session, 0, &pima_host_object);
999     UX_TEST_CHECK_SUCCESS(status);
1000 
1001     status = ux_host_class_pima_object_open(pima_host, &pima_host_session, 0, &pima_host_object);
1002     UX_TEST_CHECK_SUCCESS(status);
1003 
1004     status = ux_host_class_pima_object_close(pima_host, &pima_host_session, 0, &pima_host_object);
1005     UX_TEST_CHECK_SUCCESS(status);
1006 
1007     status = ux_host_class_pima_session_close(pima_host, &pima_host_session);
1008     UX_TEST_CHECK_SUCCESS(status);
1009 }
1010 
test_thread_host_simulation_entry(ULONG arg)1011 void  test_thread_host_simulation_entry(ULONG arg)
1012 {
1013 
1014 UINT                                                status;
1015 INT                                                 i;
1016 
1017     for (i = 0; i < 100; i ++)
1018     {
1019         if (pima_host && pima_device)
1020             break;
1021         ux_utility_delay_ms(1);
1022     }
1023     if (pima_host == UX_NULL || pima_device == UX_NULL)
1024     {
1025         printf("ERROR #%d\n", __LINE__);
1026         test_control_return(1);
1027     }
1028 
1029     test_call_pima_apis();
1030 
1031     stepinfo(">>>>>>>>>>>> All Done\n");
1032 
1033     /* Finally disconnect the device. */
1034     ux_device_stack_disconnect();
1035 
1036     /* And deinitialize the class.  */
1037     status =  ux_device_stack_class_unregister(_ux_system_slave_class_pima_name, ux_device_class_pima_entry);
1038 
1039     /* Deinitialize the device side of usbx.  */
1040     _ux_device_stack_uninitialize();
1041 
1042     /* And finally the usbx system resources.  */
1043     _ux_system_uninitialize();
1044 
1045     /* Successful test.  */
1046     printf("SUCCESS!\n");
1047     test_control_return(0);
1048 
1049 }
1050 
1051 
test_thread_device_simulation_entry(ULONG arg)1052 void  test_thread_device_simulation_entry(ULONG arg)
1053 {
1054 
1055 UINT                                                status;
1056 
1057     while(1)
1058     {
1059 
1060         /* Sleep so ThreadX on Win32 will delete this thread. */
1061         tx_thread_sleep(10);
1062     }
1063 }
1064 
1065 
pima_device_vendor_request(ULONG request,ULONG request_value,ULONG request_index,ULONG request_length,UCHAR * transfer_request_buffer,ULONG * transfer_request_length)1066 UINT pima_device_vendor_request(ULONG request, ULONG request_value, ULONG request_index, ULONG request_length,
1067                        UCHAR *transfer_request_buffer,
1068                        ULONG *transfer_request_length)
1069 {
1070 UINT    status;
1071 ULONG   length;
1072 
1073     /* Do some sanity check.  The request must be our vendor request. */
1074     if (request != UX_TEST_VENDOR_REQUEST)
1075 
1076         /* Do not proceed.  */
1077         return(UX_ERROR);
1078 
1079     /* Check the wIndex value. Values can be :
1080         0x0001 : Genre
1081         0x0004 : Extended compatible ID
1082         0x0005 : Extended properties */
1083     switch (request_index)
1084     {
1085 
1086         case    0x0001 :
1087 
1088             /* Not sure what this is for. Windows does not seem to request this. Drop it.  */
1089             status = UX_ERROR;
1090             break;
1091 
1092         case    0x0004 :
1093         case    0x0005 :
1094 
1095             /* Length to return.  */
1096             length = UX_MIN(0x28, request_length);
1097 
1098             /* Length check.  */
1099             UX_ASSERT(*transfer_request_length >= length);
1100 
1101             /* At least length should be returned.  */
1102             if (length < 4)
1103             {
1104                 status = UX_ERROR;
1105                 break;
1106             }
1107             status = UX_SUCCESS;
1108 
1109             /* Return the length.  */
1110             *transfer_request_length = length;
1111 
1112             /* Reset returned bytes.  */
1113             ux_utility_memory_set(transfer_request_buffer, 0, length);
1114 
1115             /* Build the descriptor to be returned.  This is not a composite descriptor. Single MTP.
1116                 First dword is length of the descriptor.  */
1117             ux_utility_long_put(transfer_request_buffer, 0x0028);
1118             length -= 4;
1119 
1120             /* Then the version. fixed to 0x0100.  */
1121             if (length < 2)
1122                 break;
1123             ux_utility_short_put(transfer_request_buffer + 4, 0x0100);
1124             length -= 2;
1125 
1126             /* Then the descriptor ID. Fixed to 0x0004.  */
1127             if (length < 2)
1128                 break;
1129             ux_utility_short_put(transfer_request_buffer + 6, 0x0004);
1130             length -= 2;
1131 
1132             /* Then the bcount field. Fixed to 0x0001.  */
1133             if (length < 1)
1134                 break;
1135             *(transfer_request_buffer + 8) = 0x01;
1136             length -= 1;
1137 
1138             /* Reset the next 7 bytes.  */
1139             if (length < 7)
1140                 break;
1141             ux_utility_memory_set(transfer_request_buffer + 9, 0x00, 7);
1142             length -= 7;
1143 
1144             /* Last byte of header is the interface number, here 0.  */
1145             if (length < 1)
1146                 break;
1147             *(transfer_request_buffer + 16) = 0x00;
1148             length -= 1;
1149 
1150             /* First byte of descriptor is set to 1.  */
1151             if (length < 1)
1152                 break;
1153             *(transfer_request_buffer + 17) = 0x01;
1154             length -= 1;
1155 
1156             /* Reset the next 8 + 8 + 6 bytes.  */
1157             if (length < (8+8+6))
1158                 break;
1159             ux_utility_memory_set(transfer_request_buffer + 18, 0x00, (8 + 8 + 6));
1160             length -= 8+8+6;
1161 
1162             /* Set the compatible ID to MTP.  */
1163             if (length < 3)
1164                 break;
1165             ux_utility_memory_copy(transfer_request_buffer + 18, "MTP", 3);
1166             length -= 3;
1167 
1168             /* We are done here.  */
1169             status = UX_SUCCESS;
1170             break;
1171 
1172         default :
1173             status = UX_ERROR;
1174             break;
1175 
1176     }
1177     /* Return status to device stack.  */
1178     return(status);
1179 }
1180 
pima_device_device_reset()1181 UINT    pima_device_device_reset()
1182 {
1183 
1184     /* Do nothing here.  Return Success. */
1185     return(UX_SUCCESS);
1186 
1187 }
1188 
pima_device_device_prop_desc_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG device_property,UCHAR ** device_prop_dataset,ULONG * device_prop_dataset_length)1189 UINT pima_device_device_prop_desc_get(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1190                                 ULONG device_property,
1191                                 UCHAR **device_prop_dataset,
1192                                 ULONG *device_prop_dataset_length)
1193 
1194 {
1195 UINT                            status;
1196 
1197     /* We assume the worst.  */
1198     status = UX_DEVICE_CLASS_PIMA_RC_DEVICE_PROP_NOT_SUPPORTED;
1199 
1200     /* Check which device property the host is inquiring. It needs
1201        to be one that we have declared.  */
1202     switch (device_property)
1203     {
1204 
1205             case    UX_DEVICE_CLASS_PIMA_DEV_PROP_DATE_TIME :
1206 
1207                 /* Buffer length validation.  */
1208                 UX_ASSERT(*device_prop_dataset_length >= DEVICE_PROP_DATE_TIME_DATASET_LENGTH);
1209 
1210                 /* The host is inquiring about the date/time dataset.  */
1211                 *device_prop_dataset = pima_device_prop_date_time_dataset;
1212                 *device_prop_dataset_length = DEVICE_PROP_DATE_TIME_DATASET_LENGTH;
1213 
1214                 /* We have a successful operation.  */
1215                 status = UX_SUCCESS;
1216 
1217                 break;
1218 
1219             case    UX_DEVICE_CLASS_PIMA_DEV_PROP_SYNCHRONIZATION_PARTNER :
1220 
1221                 /* Buffer length validation.  */
1222                 UX_ASSERT(*device_prop_dataset_length >= DEVICE_PROP_SYNCHRONIZATION_PARTNER_DATASET_LENGTH);
1223 
1224                 /* The host is inquiring about the synchronization partner dataset.  */
1225                 *device_prop_dataset = pima_device_prop_synchronization_partner_dataset;
1226                 *device_prop_dataset_length = DEVICE_PROP_SYNCHRONIZATION_PARTNER_DATASET_LENGTH;
1227 
1228                 /* We have a successful operation.  */
1229                 status = UX_SUCCESS;
1230 
1231                 break;
1232 
1233             case    UX_DEVICE_CLASS_PIMA_DEV_PROP_DEVICE_FRIENDLY_NAME :
1234 
1235                 /* Buffer length validation.  */
1236                 UX_ASSERT(*device_prop_dataset_length >= DEVICE_PROP_DEVICE_FRIENDLY_NAME_DATASET_LENGTH);
1237 
1238                 /* The host is inquiring about the device friendly name dataset.  */
1239                 *device_prop_dataset = pima_device_prop_device_friendly_name_dataset;
1240                 *device_prop_dataset_length = DEVICE_PROP_DEVICE_FRIENDLY_NAME_DATASET_LENGTH;
1241 
1242                 /* We have a successful operation.  */
1243                 status = UX_SUCCESS;
1244 
1245                 break;
1246 
1247             default :
1248 
1249                 /* We get here when the Initiator inquires about a property we don't know about.
1250                    That should never happen as the properties are declared to the initiator. */
1251                 status = UX_DEVICE_CLASS_PIMA_RC_DEVICE_PROP_NOT_SUPPORTED;
1252 
1253                 break;
1254     }
1255 
1256     /* Return what we found.  */
1257     return(status);
1258 
1259 }
1260 
pima_device_device_prop_value_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG device_property,UCHAR ** device_prop_value,ULONG * device_prop_value_length)1261 UINT pima_device_device_prop_value_get(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1262                                 ULONG device_property,
1263                                 UCHAR **device_prop_value,
1264                                 ULONG *device_prop_value_length)
1265 {
1266 
1267 UINT                            status;
1268 
1269     /* We assume the worst.  */
1270     status = UX_DEVICE_CLASS_PIMA_RC_DEVICE_PROP_NOT_SUPPORTED;
1271 
1272     /* Check which device property the host is inquiring. It needs
1273        to be one that we have declared.  */
1274     switch (device_property)
1275     {
1276 
1277             case    UX_DEVICE_CLASS_PIMA_DEV_PROP_DATE_TIME :
1278 
1279                 /* Buffer length validation.  */
1280                 UX_ASSERT(*device_prop_value_length >= 33);
1281 
1282                 /* The host is inquiring about the date/time value.  */
1283                 *device_prop_value = pima_device_prop_date_time_dataset + 6;
1284                 *device_prop_value_length = 33;
1285 
1286                 /* We have a successful operation.  */
1287                 status = UX_SUCCESS;
1288 
1289                 break;
1290 
1291             case    UX_DEVICE_CLASS_PIMA_DEV_PROP_SYNCHRONIZATION_PARTNER :
1292 
1293                 /* Buffer length validation.  */
1294                 UX_ASSERT(*device_prop_value_length >= 1);
1295 
1296                 /* The host is inquiring about the synchronization name dataset.  */
1297                 *device_prop_value = pima_device_prop_synchronization_partner_dataset + 6;
1298                 *device_prop_value_length = 1;
1299 
1300                 /* We have a successful operation.  */
1301                 status = UX_SUCCESS;
1302 
1303                 break;
1304 
1305             case    UX_DEVICE_CLASS_PIMA_DEV_PROP_DEVICE_FRIENDLY_NAME :
1306 
1307                 /* Buffer length validation.  */
1308                 UX_ASSERT(*device_prop_value_length >= 29);
1309 
1310                 /* The host is inquiring about the device friendly name dataset.  */
1311                 *device_prop_value = pima_device_prop_device_friendly_name_dataset + 6;
1312                 *device_prop_value_length = 29;
1313 
1314                 /* We have a successful operation.  */
1315                 status = UX_SUCCESS;
1316 
1317                 break;
1318 
1319             default :
1320 
1321                 /* We get here when the Initiator inquires about a property we don't know about.
1322                    That should never happen as the properties are declared to the initiator. */
1323                 status = UX_DEVICE_CLASS_PIMA_RC_DEVICE_PROP_NOT_SUPPORTED;
1324 
1325                 break;
1326     }
1327 
1328     /* Return what we found.  */
1329     return(status);
1330 
1331 }
1332 
pima_device_device_prop_value_set(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG device_property,UCHAR * device_prop_value,ULONG device_prop_value_length)1333 UINT pima_device_device_prop_value_set(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1334                                 ULONG device_property,
1335                                 UCHAR *device_prop_value,
1336                                 ULONG device_prop_value_length)
1337 {
1338 
1339 UINT                            status;
1340 
1341     /* We assume the worst.  */
1342     status = UX_DEVICE_CLASS_PIMA_RC_DEVICE_PROP_NOT_SUPPORTED;
1343 
1344     /* Check which device property the host wants to set. It needs
1345        to be one that we have declared.  */
1346     switch (device_property)
1347     {
1348 
1349             case    UX_DEVICE_CLASS_PIMA_DEV_PROP_DATE_TIME :
1350 
1351                 /* The host wants to set time and date value.
1352                    We only take the first 16 bytes of the Unicode string.  */
1353                 ux_utility_memory_copy (pima_device_prop_date_time_dataset + 6, device_prop_value, 0x10);
1354 
1355                 /* We have a successful operation.  */
1356                 status = UX_SUCCESS;
1357 
1358                 break;
1359 
1360     }
1361 
1362     /* Return what we found.  */
1363     return(status);
1364 
1365 
1366 }
1367 
1368 
pima_device_storage_format(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG storage_id)1369 UINT pima_device_storage_format(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1370                                 ULONG storage_id)
1371 {
1372 
1373 UINT                            status;
1374 
1375     /* Check the storage ID.  */
1376     if (storage_id == UX_TEST_PIMA_STORAGE_ID)
1377     {
1378 
1379         /* Format the ram drive. */
1380         status =  fx_media_format(&ram_disk, _fx_ram_driver, ram_disk_memory, ram_disk_buffer, 512, "RAM DISK", 2, 512, 0, UX_TEST_RAM_DISK_SIZE / 512, 512, 4, 1, 1);
1381 
1382         /* Reset the handle counter.  */
1383         pima_device_object_number_handles = 0;
1384 
1385         /* Is there an error ?  */
1386         if (status == UX_SUCCESS)
1387 
1388             /* Success. */
1389             return(status);
1390 
1391         else
1392 
1393             /* Error.  */
1394             return(UX_DEVICE_CLASS_PIMA_RC_ACCESS_DENIED);
1395     }
1396     else
1397 
1398         /* Error, wrong storage ID.  */
1399         return(UX_DEVICE_CLASS_PIMA_RC_INVALID_STORAGE_ID);
1400 
1401 }
1402 
1403 
pima_device_storage_info_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG storage_id)1404 UINT pima_device_storage_info_get(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1405                                 ULONG storage_id)
1406 {
1407 
1408     /* Check the storage ID.  */
1409     if (storage_id == UX_TEST_PIMA_STORAGE_ID)
1410     {
1411 
1412         /* We come here when the Initiator needs to update the storage info dataset.
1413            The PIMA structure has the storage info main dataset. This version only
1414            support one storage container.  */
1415         pima -> ux_device_class_pima_storage_max_capacity_low      = ram_disk.fx_media_total_clusters * ram_disk.fx_media_sectors_per_cluster * ram_disk.fx_media_bytes_per_sector;
1416         pima -> ux_device_class_pima_storage_max_capacity_high     = 0;
1417         pima -> ux_device_class_pima_storage_free_space_low        = ram_disk.fx_media_available_clusters * ram_disk.fx_media_sectors_per_cluster * ram_disk.fx_media_bytes_per_sector;
1418         pima -> ux_device_class_pima_storage_free_space_high       = 0;
1419 
1420 
1421         /* Success. */
1422         return( UX_SUCCESS);
1423 
1424     }
1425     else
1426 
1427         /* Error, wrong storage ID.  */
1428         return(UX_DEVICE_CLASS_PIMA_RC_INVALID_STORAGE_ID);
1429 
1430 }
1431 
pima_device_object_number_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_format_code,ULONG object_association,ULONG * object_number)1432 UINT pima_device_object_number_get(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1433                                 ULONG object_format_code,
1434                                 ULONG object_association,
1435                                 ULONG *object_number)
1436 {
1437 
1438     /* Return the object number.  */
1439     *object_number =  pima_device_object_number_handles;
1440 
1441     /* Return success.  */
1442     return(UX_SUCCESS);
1443 }
1444 
pima_device_object_handles_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handles_format_code,ULONG object_handles_association,ULONG * object_handles_array,ULONG object_handles_max_number)1445 UINT pima_device_object_handles_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1446                                 ULONG object_handles_format_code,
1447                                 ULONG object_handles_association,
1448                                 ULONG *object_handles_array,
1449                                 ULONG object_handles_max_number)
1450 {
1451 ULONG                           handle_index;
1452 ULONG                           number_handles;
1453 ULONG                           found_handles;
1454 ULONG                           *object_handles_array_pointer;
1455 
1456     /* Number of max handles we can store in our demo.  */
1457     number_handles = UX_TEST_MAX_HANDLES;
1458     if (number_handles > object_handles_max_number)
1459         number_handles = object_handles_max_number;
1460 
1461     /* We start with no handles found.  */
1462     found_handles = 0;
1463 
1464     /* We store the handles in the array pointer, skipping the array count. */
1465     object_handles_array_pointer = object_handles_array + 1;
1466 
1467     /* Store all the handles we have in the media for the specific format code if utilized.  */
1468     for (handle_index = 0; handle_index < number_handles; handle_index++)
1469     {
1470 
1471         /* Check if this handle is valid. If 0, it may have been destroyed or unused yet.  */
1472         if (pima_device_object_number_handles_array[handle_index] != 0)
1473         {
1474 
1475             /* This handle is populated. Check the format code supplied by the app.
1476                if 0 or -1, we discard the format code check.  If not 0 or -1 check
1477                it the stored object matches the format code.  */
1478             if ((object_handles_format_code == 0) || (object_handles_format_code == 0xFFFFFFFF) ||
1479                 pima_device_object_info_array[handle_index].ux_device_class_pima_object_format == object_handles_format_code)
1480             {
1481                 /* We have a candidate.  Store the handle. */
1482                 ux_utility_long_put((UCHAR *) object_handles_array_pointer, pima_device_object_number_handles_array[handle_index]);
1483 
1484                 /* Next array container.  */
1485                 object_handles_array_pointer++;
1486 
1487                 /* We have found one handle more.  */
1488                 found_handles++;
1489 
1490                 /* Check if we are reaching the max array of handles.  */
1491                 if (found_handles == object_handles_max_number)
1492                 {
1493 
1494                     /* Array is saturated. Store what we have found.  */
1495                     ux_utility_long_put((UCHAR *) object_handles_array, found_handles);
1496 
1497                     /* And return to the Pima class.  */
1498                     return(UX_SUCCESS);
1499 
1500                 }
1501             }
1502         }
1503 
1504     }
1505 
1506     /* Array is populated. Store what we have found.  */
1507     ux_utility_long_put((UCHAR *) object_handles_array, found_handles);
1508 
1509     /* And return to the Pima class.  */
1510     return(UX_SUCCESS);
1511 
1512 }
1513 
pima_device_object_info_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handle,UX_SLAVE_CLASS_PIMA_OBJECT ** object)1514 UINT pima_device_object_info_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1515                                 ULONG object_handle,
1516                                 UX_SLAVE_CLASS_PIMA_OBJECT **object)
1517 {
1518 UINT                            status;
1519 ULONG                           handle_index;
1520 
1521     /* Check the object handle. It must be in the local array.  */
1522     status = pima_device_object_handle_check(object_handle, object, &handle_index);
1523 
1524     /* Does the object handle exist ?  */
1525     if (status == UX_SUCCESS)
1526     {
1527 
1528         /* Yes, the handle is valid. The object pointer has been updated.  */
1529         return(UX_SUCCESS);
1530     }
1531     else
1532 
1533         /* Done here. Return error.  */
1534         return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_HANDLE);
1535 
1536 }
1537 
pima_device_object_data_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handle,UCHAR * object_buffer,ULONG object_offset,ULONG object_length_requested,ULONG * object_actual_length)1538 UINT pima_device_object_data_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1539                                 ULONG object_handle,
1540                                 UCHAR *object_buffer,
1541                                 ULONG object_offset,
1542                                 ULONG object_length_requested,
1543                                 ULONG *object_actual_length)
1544 
1545 {
1546 
1547 UINT                            status;
1548 UINT                            status_close;
1549 ULONG                           handle_index;
1550 UX_SLAVE_CLASS_PIMA_OBJECT      *object;
1551 CHAR                            object_filename[64];
1552 
1553 
1554     /* Check the object handle. It must be in the local array.  */
1555     status = pima_device_object_handle_check(object_handle, &object, &handle_index);
1556 
1557     /* Does the object handle exist ?  */
1558     if (status != UX_SUCCESS)
1559         return(status);
1560 
1561     /* Check if entire file is read,
1562        this could happen if last actual length equals to length requested.  */
1563     if (object_offset >= pima_device_object_filex_array[handle_index].fx_file_current_file_size)
1564     {
1565 
1566         /* Nothing to read.  */
1567         *object_actual_length = 0;
1568         return(UX_SUCCESS);
1569     }
1570 
1571     /* We are either at the beginning of the transfer or continuing the transfer.
1572         Check of the filex array handle exist already.  */
1573     if (pima_device_object_filex_array[handle_index].fx_file_id == 0)
1574     {
1575 
1576         /* The object file name is in Unicode, decrypt it first because FileX is not using
1577         unicode format.  */
1578         _ux_utility_unicode_to_string(object -> ux_device_class_pima_object_filename, (UCHAR *) object_filename);
1579 
1580         /* File not yet opened for this object.  Open the file. */
1581         status =  fx_file_open(&ram_disk, &pima_device_object_filex_array[handle_index], (CHAR *) object_filename, FX_OPEN_FOR_READ);
1582 
1583         /* Any problems with the opening ? */
1584         if (status != UX_SUCCESS)
1585             return(UX_DEVICE_CLASS_PIMA_RC_OBJECT_NOT_OPENED);
1586 
1587     }
1588 
1589     /* Seek to the offset of the object file.  */
1590     status =  fx_file_seek(&pima_device_object_filex_array[handle_index], object_offset);
1591     if (status != UX_SUCCESS)
1592         return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_REFERENCE);
1593 
1594     /* Read from the file into the media buffer.  */
1595     status =   fx_file_read(&pima_device_object_filex_array[handle_index], object_buffer, object_length_requested, object_actual_length);
1596 
1597     /* Check the status.  */
1598     if (status == UX_SUCCESS)
1599 
1600         /* Done. Operation successful.  */
1601         status = UX_SUCCESS;
1602 
1603     else
1604     {
1605 
1606         /* See what the error might be.  */
1607         switch (status)
1608         {
1609 
1610             case FX_MEDIA_NOT_OPEN :
1611 
1612                 /* Problem with media.  */
1613                 status =  UX_DEVICE_CLASS_PIMA_RC_STORE_NOT_AVAILABLE;
1614                 break;
1615 
1616             case FX_NO_MORE_SPACE :
1617 
1618                 /* Media is full.  */
1619                 status =  UX_DEVICE_CLASS_PIMA_RC_STORE_FULL;
1620                 break;
1621 
1622             default :
1623                 status =  UX_DEVICE_CLASS_PIMA_RC_ACCESS_DENIED;
1624                 break;
1625 
1626         }
1627     }
1628 
1629     /* Check if we have read the entire file.  We compare the current position in the file with the file size. */
1630     if (pima_device_object_filex_array[handle_index].fx_file_current_file_size == pima_device_object_filex_array[handle_index].fx_file_current_file_offset)
1631     {
1632 
1633         /* This is the end of the transfer for the object. Close it.  */
1634         status_close =   fx_file_close(&pima_device_object_filex_array[handle_index]);
1635 
1636         /* FX file id is not cleared by fx_file_close.  */
1637         pima_device_object_filex_array[handle_index].fx_file_id = 0;
1638 
1639         /* Check the status.  */
1640         if (status_close == UX_SUCCESS && status == UX_SUCCESS)
1641 
1642             /* Done. Operation successful.  */
1643             return (UX_SUCCESS);
1644 
1645         else
1646         {
1647 
1648             /* See what the error might be.  */
1649             switch (status_close)
1650             {
1651 
1652                 case FX_MEDIA_NOT_OPEN :
1653 
1654                     /* Problem with media.  */
1655                     status_close =  UX_DEVICE_CLASS_PIMA_RC_STORE_NOT_AVAILABLE;
1656                     break;
1657 
1658                 default :
1659                     status_close =  UX_DEVICE_CLASS_PIMA_RC_ACCESS_DENIED;
1660                     break;
1661 
1662             }
1663 
1664             /* If status is error. we return status. If status_close is error we return status_close.  */
1665             if(status != UX_SUCCESS)
1666 
1667                 /* We return the status of read operation.  */
1668                 return(status);
1669 
1670             else
1671 
1672                 /* Return status from close operation. */
1673                 return(status_close);
1674 
1675         }
1676     }
1677 
1678     /* Done here. Return status.  */
1679     return(status);
1680 }
1681 
pima_device_object_info_send(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,UX_SLAVE_CLASS_PIMA_OBJECT * object,ULONG storage_id,ULONG parent_object_handle,ULONG * object_handle)1682 UINT pima_device_object_info_send (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1683                                 UX_SLAVE_CLASS_PIMA_OBJECT *object,
1684                                 ULONG storage_id,
1685                                 ULONG parent_object_handle,
1686                                 ULONG *object_handle)
1687 {
1688 ULONG                           handle_index;
1689 CHAR                            object_filename[64];
1690 UINT                            status;
1691 
1692     /* Make sure we can accommodate a new object here.  */
1693     if (pima_device_object_number_handles < UX_TEST_MAX_HANDLES)
1694     {
1695 
1696         /* The object file name is in Unicode, decrypt it first because FileX is not using
1697            unicode format.  */
1698         ux_utility_unicode_to_string(object -> ux_device_class_pima_object_filename, (UCHAR *) object_filename);
1699 
1700         /* The object can be either an association object (a directory) or a regular file such
1701            a photo, music file, video file ... */
1702         if (object -> ux_device_class_pima_object_format == UX_DEVICE_CLASS_PIMA_OFC_ASSOCIATION)
1703         {
1704 
1705             /* The object info refers to a association. We treat it as a folder.  */
1706             status =  fx_directory_create(&ram_disk, object_filename);
1707 
1708             /* Check status. If error, identify the problem and convert FileX error code into PIMA error code.  */
1709             if (status != UX_SUCCESS)
1710             {
1711 
1712                 /* See what the error might be.  */
1713                 switch (status)
1714                 {
1715 
1716                     case FX_MEDIA_NOT_OPEN :
1717 
1718                         /* Problem with media.  */
1719                         status =  UX_DEVICE_CLASS_PIMA_RC_STORE_NOT_AVAILABLE;
1720                         break;
1721 
1722                     case FX_NO_MORE_SPACE :
1723 
1724                         /* Media is full.  */
1725                         status =  UX_DEVICE_CLASS_PIMA_RC_STORE_FULL;
1726                         break;
1727 
1728                     case FX_WRITE_PROTECT :
1729 
1730                         /* Media is write protected.  */
1731                         status =  UX_DEVICE_CLASS_PIMA_RC_STORE_READ_ONLY;
1732                         break;
1733 
1734                     default :
1735                         status =  UX_DEVICE_CLASS_PIMA_RC_ACCESS_DENIED;
1736                         break;
1737 
1738                 }
1739 
1740                 /* Could not create the object on the local media, return an error.  */
1741                 return (status);
1742             }
1743         }
1744         else
1745         {
1746             /* The format is for another object.  */
1747             /* Create the destination file. */
1748             status =  fx_file_create(&ram_disk, object_filename);
1749 
1750             /* Check status. If error, identify the problem and convert FileX error code into PIMA error code.  */
1751             if (status != UX_SUCCESS)
1752             {
1753 
1754                 /* See what the error might be.  */
1755                 switch (status)
1756                 {
1757 
1758                     case FX_MEDIA_NOT_OPEN :
1759 
1760                         /* Problem with media.  */
1761                         status =  UX_DEVICE_CLASS_PIMA_RC_STORE_NOT_AVAILABLE;
1762                         break;
1763 
1764                     case FX_NO_MORE_SPACE :
1765 
1766                         /* Media is full.  */
1767                         status =  UX_DEVICE_CLASS_PIMA_RC_STORE_FULL;
1768                         break;
1769 
1770                     case FX_WRITE_PROTECT :
1771 
1772                         /* Media is write protected.  */
1773                         status =  UX_DEVICE_CLASS_PIMA_RC_STORE_READ_ONLY;
1774                         break;
1775 
1776                     default :
1777                         status =  UX_DEVICE_CLASS_PIMA_RC_ACCESS_DENIED;
1778                         break;
1779 
1780                 }
1781 
1782                 /* Could not create the object on the local media, return an error.  */
1783                 return (status);
1784             }
1785         }
1786 
1787         /* The object is created.  Store the object handle. Find a spot. */
1788         for (handle_index = 0; handle_index < UX_TEST_MAX_HANDLES; handle_index++)
1789         {
1790 
1791             /* Check for an empty slot.  */
1792             if (pima_device_object_number_handles_array[handle_index] == 0)
1793             {
1794 
1795                 /* We have found the place to store the handle and the object info. */
1796                 ux_utility_memory_copy(&pima_device_object_info_array[handle_index], object, sizeof(UX_SLAVE_CLASS_PIMA_OBJECT));
1797                 if (pima_device_object_info_array[handle_index].ux_device_class_pima_object_storage_id == 0)
1798                     pima_device_object_info_array[handle_index].ux_device_class_pima_object_storage_id = storage_id;
1799                 if (pima_device_object_info_array[handle_index].ux_device_class_pima_object_parent_object == 0xFFFFFFFF)
1800                     pima_device_object_info_array[handle_index].ux_device_class_pima_object_parent_object = 0;
1801 
1802                 /* Remember the object handle locally.  */
1803                 pima_device_object_number_handles_array[handle_index] =  handle_index + 1;
1804 
1805                 /* Extract from the object the MTP dataset information we need : StorageID.
1806                    if the storage id in the object info dataset is 0, the Initiator leaves it to the responder to store the object.  */
1807                 if (object -> ux_device_class_pima_object_storage_id != 0)
1808                     pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_storage_id = object -> ux_device_class_pima_object_storage_id;
1809                 else
1810                     /* Take the storage ID given as a parameter by the function.  */
1811                     pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_storage_id = storage_id;
1812 
1813                 /* Extract from the object the MTP dataset information we need : Format.  */
1814                 pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_format = object -> ux_device_class_pima_object_format;
1815 
1816                 /* Extract from the object the MTP dataset information we need : Protection Status.  */
1817                 pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_protection_status = object -> ux_device_class_pima_object_protection_status;
1818 
1819                 /* Extract from the object the MTP dataset information we need : Size.  */
1820                 pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_size_low  = object -> ux_device_class_pima_object_compressed_size;
1821                 pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_size_high = 0;
1822 
1823                 /* Extract from the object the MTP dataset information we need : Parent Object.  */
1824                 if (object -> ux_device_class_pima_object_parent_object == 0xFFFFFFFF)
1825                     pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_parent_object = 0;
1826                 else
1827                     pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_parent_object  = object -> ux_device_class_pima_object_parent_object;
1828 
1829                 /* Keep the file name in ASCIIZ.  */
1830                 ux_utility_unicode_to_string(object -> ux_device_class_pima_object_filename, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_file_name);
1831                 ux_utility_unicode_to_string(object -> ux_device_class_pima_object_filename, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_name);
1832 
1833                 /* Keep the unique object identifier for this object. This is incremented each time we have a new object.
1834                    This number is unique to the MTP device for every object stored, even after being deleted.
1835                    There is a hack here. We only keep track of the first dword. A full implementation should ensure all 128 bits are used.
1836                    The identifier is incremented as soon as it is being used.  */
1837                 pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_persistent_unique_object_identifier[0] = pima_device_object_persistent_unique_identifier++;
1838 
1839                 /* Return the object handle to the application.  */
1840                 *object_handle = handle_index + 1;
1841 
1842                 /* Increment the number of known handles.  */
1843                 pima_device_object_number_handles++;
1844 
1845                 /* We are done here.  Return success.  */
1846                 return(UX_SUCCESS);
1847             }
1848         }
1849 
1850         /* We should never get here. */
1851         return(UX_DEVICE_CLASS_PIMA_RC_STORE_FULL);
1852 
1853     }
1854 
1855     /* No more space for handle. Return storage full.  */
1856     return(UX_DEVICE_CLASS_PIMA_RC_STORE_FULL);
1857 
1858 }
1859 
1860 
pima_device_object_data_send(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handle,ULONG phase,UCHAR * object_buffer,ULONG object_offset,ULONG object_length)1861 UINT pima_device_object_data_send (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1862                                 ULONG object_handle,
1863                                 ULONG phase ,
1864                                 UCHAR *object_buffer,
1865                                 ULONG object_offset,
1866                                 ULONG object_length)
1867 {
1868 
1869 UINT                            status;
1870 ULONG                           handle_index;
1871 UX_SLAVE_CLASS_PIMA_OBJECT      *object;
1872 CHAR                            object_filename[64];
1873 
1874     /* Check the object handle. It must be in the local array.  */
1875     status = pima_device_object_handle_check(object_handle, &object, &handle_index);
1876 
1877     /* Does the object handle exist ?  */
1878     if (status == UX_SUCCESS)
1879     {
1880 
1881         /* Check the phase. Either Active or Complete.  */
1882         switch (phase)
1883         {
1884 
1885             case     UX_DEVICE_CLASS_PIMA_OBJECT_TRANSFER_PHASE_ACTIVE        :
1886 
1887                 /* We are either at the beginning of the transfer or continuing the transfer.  */
1888                 if (object_offset == 0)
1889                 {
1890 
1891                     /* The object file name is in Unicode, decrypt it first because FileX is not using
1892                        unicode format.  */
1893                     ux_utility_unicode_to_string(object -> ux_device_class_pima_object_filename, (UCHAR *) object_filename);
1894 
1895                     /* Open the file on the media since we expect a SendObject.  */
1896                     status =  fx_file_open(&ram_disk, &pima_device_object_filex_array[handle_index], object_filename, FX_OPEN_FOR_WRITE);
1897                     if (status != UX_SUCCESS)
1898                         return(UX_DEVICE_CLASS_PIMA_RC_OBJECT_NOT_OPENED);
1899 
1900                     /* Seek to the beginning of the object file.  */
1901                     status =  fx_file_seek(&pima_device_object_filex_array[handle_index], 0);
1902                     if (status != UX_SUCCESS)
1903                         return(UX_DEVICE_CLASS_PIMA_RC_OBJECT_NOT_OPENED);
1904                 }
1905 
1906                 /*   We write the object data to the media.  */
1907                 status =   fx_file_write(&pima_device_object_filex_array[handle_index], object_buffer, object_length);
1908 
1909                 /* Check the status.  */
1910                 if (status == UX_SUCCESS)
1911 
1912                     /* Done. Operation successful.  */
1913                     return (UX_SUCCESS);
1914 
1915                 else
1916                 {
1917 
1918                     /* See what the error might be.  */
1919                     switch (status)
1920                     {
1921 
1922                         case FX_MEDIA_NOT_OPEN :
1923 
1924                             /* Problem with media.  */
1925                             status =  UX_DEVICE_CLASS_PIMA_RC_STORE_NOT_AVAILABLE;
1926                             break;
1927 
1928                         case FX_NO_MORE_SPACE :
1929 
1930                             /* Media is full.  */
1931                             status =  UX_DEVICE_CLASS_PIMA_RC_STORE_FULL;
1932                             break;
1933 
1934                         case FX_WRITE_PROTECT :
1935 
1936                             /* Media is write protected.  */
1937                             status =  UX_DEVICE_CLASS_PIMA_RC_STORE_READ_ONLY;
1938                             break;
1939 
1940                         default :
1941                             status =  UX_DEVICE_CLASS_PIMA_RC_ACCESS_DENIED;
1942                             break;
1943 
1944                     }
1945                     /* Return the error.  */
1946                     return(status);
1947 
1948                 }
1949                 break;
1950 
1951             case    UX_DEVICE_CLASS_PIMA_OBJECT_TRANSFER_PHASE_COMPLETED    :
1952 
1953                 /* Save final object size.  */
1954                 pima_device_object_info_array[handle_index].ux_device_class_pima_object_compressed_size =
1955                     pima_device_object_filex_array[handle_index].fx_file_current_file_size;
1956 
1957                 /* This is the end of the transfer for the object. Close it.  */
1958                 status = fx_file_close(&pima_device_object_filex_array[handle_index]);
1959                 pima_device_object_filex_array[handle_index].fx_file_id = 0;
1960 
1961                 /* Check the status.  */
1962                 if (status == UX_SUCCESS)
1963 
1964                     /* Done. Operation successful.  */
1965                     return (UX_SUCCESS);
1966 
1967                 else
1968                 {
1969 
1970                     /* See what the error might be.  */
1971                     switch (status)
1972                     {
1973 
1974                         case FX_MEDIA_NOT_OPEN :
1975 
1976                             /* Problem with media.  */
1977                             status =  UX_DEVICE_CLASS_PIMA_RC_STORE_NOT_AVAILABLE;
1978                             break;
1979 
1980                         default :
1981                             status =  UX_DEVICE_CLASS_PIMA_RC_ACCESS_DENIED;
1982                             break;
1983 
1984                     }
1985                     /* Return the error.  */
1986                     return(status);
1987 
1988                 }
1989                 break;
1990 
1991             case    UX_DEVICE_CLASS_PIMA_OBJECT_TRANSFER_PHASE_COMPLETED_ERROR    :
1992 
1993                 /* Close and delete the object.  */
1994                 pima_device_object_delete(pima, object_handle);
1995 
1996                 /* We return OK no matter what.  */
1997                 return(UX_SUCCESS);
1998         }
1999     }
2000 
2001     /* Done here. Return error.  */
2002     return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_HANDLE);
2003 
2004 }
2005 
pima_device_object_delete(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handle)2006 UINT pima_device_object_delete(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
2007                                 ULONG object_handle)
2008 {
2009 UX_SLAVE_CLASS_PIMA_OBJECT      *object;
2010 ULONG                           handle_index;
2011 CHAR                            object_filename[64];
2012 UINT                            status;
2013 
2014     /* Check the object handle. It must be in the local array.  */
2015     status = pima_device_object_handle_check(object_handle, &object, &handle_index);
2016 
2017     /* Does the object handle exist ?  */
2018     if (status == UX_SUCCESS)
2019     {
2020 
2021         /* The object file name is in Unicode, decrypt it first because FileX is not using
2022            unicode format.  */
2023         ux_utility_unicode_to_string(object -> ux_device_class_pima_object_filename, (UCHAR *) object_filename);
2024 
2025         /* Yes, the handle is valid. The object pointer has been updated.  */
2026         /* The object may still be opened, try to close the handle first.  */
2027         status =  fx_file_close(&pima_device_object_filex_array[handle_index]);
2028 
2029         /* Delete the destination file. */
2030         status =  fx_file_delete(&ram_disk, object_filename);
2031 
2032         /* Check if we had an error. */
2033         if (status != UX_SUCCESS)
2034         {
2035 
2036             /* See what the error might be.  */
2037             switch (status)
2038             {
2039 
2040                 case FX_MEDIA_NOT_OPEN :
2041 
2042                     /* Problem with media.  */
2043                     status =  UX_DEVICE_CLASS_PIMA_RC_STORE_NOT_AVAILABLE;
2044                     break;
2045 
2046                 case FX_WRITE_PROTECT :
2047 
2048                     /* Media is write protected.  */
2049                     status =  UX_DEVICE_CLASS_PIMA_RC_STORE_READ_ONLY;
2050                     break;
2051 
2052                 default :
2053                     status =  UX_DEVICE_CLASS_PIMA_RC_ACCESS_DENIED;
2054                     break;
2055             }
2056 
2057             /* Return the error code.  */
2058             return(status);
2059 
2060         }
2061         else
2062         {
2063 
2064             /* The object was deleted on disk. Now update the internal application array tables.  */
2065             pima_device_object_number_handles_array[handle_index] = 0;
2066 
2067             /* Update the number of handles in the system.  */
2068             pima_device_object_number_handles--;
2069 
2070             /* We are done here.  */
2071             return(UX_SUCCESS);
2072         }
2073 
2074     }
2075     else
2076 
2077         /* Done here. Return error.  */
2078         return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_HANDLE);
2079 }
2080 
2081 
pima_device_object_prop_desc_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_property,ULONG object_format_code,UCHAR ** object_prop_dataset,ULONG * object_prop_dataset_length)2082 UINT pima_device_object_prop_desc_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
2083                                 ULONG object_property,
2084                                 ULONG object_format_code,
2085                                 UCHAR **object_prop_dataset,
2086                                 ULONG *object_prop_dataset_length)
2087 {
2088 UINT                            status;
2089 UCHAR                           *object_property_dataset_data;
2090 ULONG                           object_property_dataset_data_length;
2091 
2092     /* Check the object format belongs to the list. 3 categories : generic, audio, video */
2093     switch (object_format_code)
2094     {
2095 
2096         case    UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED                            :
2097         case    UX_DEVICE_CLASS_PIMA_OFC_ASSOCIATION                          :
2098         case    UX_DEVICE_CLASS_PIMA_OFC_MP3                                  :
2099         case    UX_DEVICE_CLASS_PIMA_OFC_ASF                                  :
2100         case    UX_DEVICE_CLASS_PIMA_OFC_WMA                                  :
2101         case    UX_DEVICE_CLASS_PIMA_OFC_WMV                                  :
2102         case    UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_AUDIO_ALBUM                 :
2103         case    UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_AUDIO_AND_VIDEO_PLAYLIST    :
2104 
2105             /* Set the pointer to the dataset_buffer.  */
2106             object_property_dataset_data = pima_device_object_property_dataset_data_buffer;
2107 
2108             /* Isolate the property. That will determine the dataset header.  */
2109             switch (object_property)
2110             {
2111                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID            :
2112 
2113                     /* Add the property code.  */
2114                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID);
2115 
2116                     /* Data type is UINT16.  */
2117                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT16);
2118 
2119                     /* GetSet value is GET.  */
2120                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2121 
2122                     /* Default value is UINT16.  */
2123                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2124 
2125                     /* Group code is NULL.  */
2126                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 2, 0);
2127 
2128                     /* Form Flag is not used.  */
2129                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 6) = 0;
2130 
2131                     /* Set the length.  */
2132                     object_property_dataset_data_length = 12;
2133 
2134                     /* We could create this property. */
2135                     status = UX_SUCCESS;
2136 
2137                     /* Done here.  */
2138                     break;
2139 
2140                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT        :
2141 
2142                     /* Add the property code.  */
2143                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT);
2144 
2145                     /* Data type is UINT16.  */
2146                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT16);
2147 
2148                     /* GetSet value is GET.  */
2149                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2150 
2151                     /* Default value is UINT16.  */
2152                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2153 
2154                     /* Group code is 3.  */
2155                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 2, 3);
2156 
2157                     /* Form Flag is not used.  */
2158                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 6) = 0;
2159 
2160                     /* Set the length.  */
2161                     object_property_dataset_data_length = 12;
2162 
2163                     /* We could create this property. */
2164                     status = UX_SUCCESS;
2165 
2166                     /* Done here.  */
2167                     break;
2168 
2169                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS        :
2170 
2171                     /* Add the property code.  */
2172                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS);
2173 
2174                     /* Data type is UINT16.  */
2175                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT16);
2176 
2177                     /* GetSet value is GET.  */
2178                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2179 
2180                     /* Default value is UINT16.  */
2181                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2182 
2183                     /* Group code is 4.  */
2184                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 2, 4);
2185 
2186                     /* Form Flag ENUM.  */
2187                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 6) = 2;
2188 
2189                     /* Number of elements in Enum array.  */
2190                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 7, 2);
2191 
2192                     /* Elements in Enum array.  Here we store only No protection and Read-Only protection values. This can be extended with
2193                        Read-only data and Non transferrable data. Spec talks about MTP vendor extension range as well. Not used here.  */
2194                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 0);
2195                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 11, 1);
2196 
2197                     /* Set the length.  */
2198                     object_property_dataset_data_length = 18;
2199 
2200                     /* We could create this property. */
2201                     status = UX_SUCCESS;
2202 
2203                     /* Done here.  */
2204                     break;
2205 
2206                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE        :
2207 
2208                     /* Add the property code.  */
2209                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE);
2210 
2211                     /* Data type is UINT64.  */
2212                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT64);
2213 
2214                     /* GetSet value is GET.  */
2215                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2216 
2217                     /* Default value is UINT64.  */
2218                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2219                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 0);
2220 
2221                     /* Group code is NULL.  */
2222                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8, 0);
2223 
2224                     /* Form Flag is not used.  */
2225                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 12) = 0;
2226 
2227                     /* Set the length.  */
2228                     object_property_dataset_data_length = 18;
2229 
2230                     /* We could create this property. */
2231                     status = UX_SUCCESS;
2232 
2233                     /* Done here.  */
2234                     break;
2235 
2236                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME    :
2237 
2238                     /* Add the property code.  */
2239                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME);
2240 
2241                     /* Data type is STRING.  */
2242                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_STR);
2243 
2244                     /* GetSet value is GETSET.  */
2245                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2246 
2247                     /* Store a empty Unicode string.   */
2248                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
2249 
2250                     /* Group code is NULL.  */
2251                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 0);
2252 
2253                     /* Form Flag is not used.  */
2254                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 0;
2255 
2256                     /* Set the length.  */
2257                     object_property_dataset_data_length = 11;
2258 
2259                     /* We could create this property. */
2260                     status = UX_SUCCESS;
2261 
2262                     /* Done here.  */
2263                     break;
2264 
2265                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT        :
2266 
2267                     /* Add the property code.  */
2268                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT);
2269 
2270                     /* Data type is UINT32.  */
2271                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2272 
2273                     /* GetSet value is GET.  */
2274                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2275 
2276                     /* Default value is UINT32.  */
2277                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2278 
2279                     /* Group code is NULL.  */
2280                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 0);
2281 
2282                     /* Form Flag is not used.  */
2283                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 0;
2284 
2285                     /* Set the length.  */
2286                     object_property_dataset_data_length = 14;
2287 
2288                     /* We could create this property. */
2289                     status = UX_SUCCESS;
2290 
2291                     /* Done here.  */
2292                     break;
2293 
2294 
2295                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER        :
2296 
2297                     /* Add the property code.  */
2298                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER);
2299 
2300                     /* Data type is UINT128.  */
2301                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT128);
2302 
2303                     /* GetSet value is GET.  */
2304                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2305 
2306                     /* Default value is UINT128.  */
2307                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2308                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 0);
2309                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8, 0);
2310                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 12, 0);
2311 
2312                     /* Group code is NULL.  */
2313                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 16, 0);
2314 
2315                     /* Form Flag is not used.  */
2316                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 20) = 0;
2317 
2318                     /* Set the length.  */
2319                     object_property_dataset_data_length = 26;
2320 
2321                     /* We could create this property. */
2322                     status = UX_SUCCESS;
2323 
2324                     /* Done here.  */
2325                     break;
2326 
2327 
2328                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME    :
2329 
2330                     /* Add the property code.  */
2331                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME);
2332 
2333                     /* Data type is STRING.  */
2334                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_STR);
2335 
2336                     /* GetSet value is GETSET.  */
2337                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2338 
2339                     /* Store a empty Unicode string.   */
2340                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
2341 
2342                     /* Group code is 2.  */
2343                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 2);
2344 
2345                     /* Form Flag is not used.  */
2346                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 0;
2347 
2348                     /* Set the length.  */
2349                     object_property_dataset_data_length = 11;
2350 
2351                     /* We could create this property. */
2352                     status = UX_SUCCESS;
2353 
2354                     /* Done here.  */
2355                     break;
2356 
2357 
2358                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE        :
2359 
2360                     /* Add the property code.  */
2361                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE);
2362 
2363                     /* Data type is UINT8.  */
2364                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT8);
2365 
2366                     /* GetSet value is GET/SET.  */
2367                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2368 
2369                     /* Default value is UINT8.  */
2370                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
2371 
2372                     /* Group code is 2.  */
2373                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 2);
2374 
2375                     /* Form Flag ENUM.  */
2376                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 2;
2377 
2378                     /* Number of elements in Enum array.  */
2379                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 6, 2);
2380 
2381                     /* Elements in Enum array.  */
2382                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) =  0;
2383                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9) =  1;
2384 
2385                     /* Set the length.  */
2386                     object_property_dataset_data_length = 15;
2387 
2388                     /* We could create this property. */
2389                     status = UX_SUCCESS;
2390 
2391                     /* Done here.  */
2392                     break;
2393 
2394 
2395                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ARTIST                :
2396 
2397                     /* Add the property code.  */
2398                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ARTIST);
2399 
2400                     /* Data type is STRING.  */
2401                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_STR);
2402 
2403                     /* GetSet value is GETSET.  */
2404                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2405 
2406                     /* Store a empty Unicode string.   */
2407                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
2408 
2409                     /* Group code is NULL.  */
2410                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 0);
2411 
2412                     /* Form Flag is not used.  */
2413                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 0;
2414 
2415                     /* Set the length.  */
2416                     object_property_dataset_data_length = 11;
2417 
2418                     /* We could create this property. */
2419                     status = UX_SUCCESS;
2420 
2421                     /* Done here.  */
2422                     break;
2423 
2424 
2425                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_TRACK            :
2426 
2427                     /* Add the property code.  */
2428                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_TRACK);
2429 
2430                     /* Data type is UINT16.  */
2431                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT16);
2432 
2433                     /* GetSet value is GET.  */
2434                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2435 
2436                     /* Default value is UINT16.  */
2437                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2438 
2439                     /* Group code is 3.  */
2440                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 2, 3);
2441 
2442                     /* Form Flag is not used.  */
2443                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 6) = 0;
2444 
2445                     /* Set the length.  */
2446                     object_property_dataset_data_length = 12;
2447 
2448                     /* We could create this property. */
2449                     status = UX_SUCCESS;
2450 
2451                     /* Done here.  */
2452                     break;
2453 
2454 
2455                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_USE_COUNT            :
2456 
2457                     /* Add the property code.  */
2458                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_USE_COUNT);
2459 
2460                     /* Data type is UINT32.  */
2461                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2462 
2463                     /* GetSet value is GET/SET.  */
2464                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2465 
2466                     /* Default value is UINT32.  */
2467                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2468 
2469                     /* Group code is 1.  */
2470                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 0);
2471 
2472                     /* Form Flag is not used.  */
2473                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 0;
2474 
2475                     /* Set the length.  */
2476                     object_property_dataset_data_length = 14;
2477 
2478                     /* We could create this property. */
2479                     status = UX_SUCCESS;
2480 
2481                     /* Done here.  */
2482                     break;
2483 
2484 
2485                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DATE_AUTHORED        :
2486 
2487                     /* Add the property code.  */
2488                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DATE_AUTHORED);
2489 
2490                     /* Data type is STRING.  */
2491                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_STR);
2492 
2493                     /* GetSet value is GETSET.  */
2494                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2495 
2496                     /* Store a empty Unicode string.   */
2497                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
2498 
2499                     /* Group code is NULL.  */
2500                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 0);
2501 
2502                     /* Form Flag is 3.  */
2503                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 3;
2504 
2505                     /* Set the length.  */
2506                     object_property_dataset_data_length = 11;
2507 
2508                     /* We could create this property. */
2509                     status = UX_SUCCESS;
2510 
2511                     /* Done here.  */
2512                     break;
2513 
2514                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE                :
2515 
2516                     /* Add the property code.  */
2517                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE);
2518 
2519                     /* Data type is STRING.  */
2520                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_STR);
2521 
2522                     /* GetSet value is GETSET.  */
2523                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2524 
2525                     /* Store a empty Unicode string.   */
2526                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
2527 
2528                     /* Group code is NULL.  */
2529                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 0);
2530 
2531                     /* Form Flag is not used.  */
2532                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 0;
2533 
2534                     /* Set the length.  */
2535                     object_property_dataset_data_length = 11;
2536 
2537                     /* We could create this property. */
2538                     status = UX_SUCCESS;
2539 
2540                     /* Done here.  */
2541                     break;
2542 
2543                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_NAME        :
2544 
2545                     /* Add the property code.  */
2546                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_NAME);
2547 
2548                     /* Data type is STRING.  */
2549                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_STR);
2550 
2551                     /* GetSet value is GETSET.  */
2552                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2553 
2554                     /* Store a empty Unicode string.   */
2555                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
2556 
2557                     /* Group code is NULL.  */
2558                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 0);
2559 
2560                     /* Form Flag is not used.  */
2561                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 0;
2562 
2563                     /* Set the length.  */
2564                     object_property_dataset_data_length = 11;
2565 
2566                     /* We could create this property. */
2567                     status = UX_SUCCESS;
2568 
2569                     /* Done here.  */
2570                     break;
2571 
2572                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_ARTIST        :
2573 
2574                     /* Add the property code.  */
2575                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_ARTIST);
2576 
2577                     /* Data type is STRING.  */
2578                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_STR);
2579 
2580                     /* GetSet value is GETSET.  */
2581                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2582 
2583                     /* Store a empty Unicode string.   */
2584                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
2585 
2586                     /* Group code is NULL.  */
2587                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 0);
2588 
2589                     /* Form Flag is not used.  */
2590                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 0;
2591 
2592                     /* Set the length.  */
2593                     object_property_dataset_data_length = 11;
2594 
2595                     /* We could create this property. */
2596                     status = UX_SUCCESS;
2597 
2598                     /* Done here.  */
2599                     break;
2600 
2601 
2602                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SAMPLE_RATE        :
2603 
2604                     /* Add the property code.  */
2605                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SAMPLE_RATE);
2606 
2607                     /* Data type is UINT32.  */
2608                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2609 
2610                     /* GetSet value is GET.  */
2611                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2612 
2613                     /* Default value is UINT32.  */
2614                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2615 
2616                     /* Group code is 0.  */
2617                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 0);
2618 
2619                     /* Form Flag RANGE.  */
2620                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 1;
2621 
2622                     /* Minimum range in array is 0KHZ.  */
2623                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 0x00000000);
2624 
2625                     /* Maximum range in array is KHZ.  */
2626                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 13,0x0002EE00 );
2627 
2628                     /* Range step size is 32HZ.  */
2629                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 17,0x00000020 );
2630 
2631                     /* Set the length.  */
2632                     object_property_dataset_data_length = 26;
2633 
2634                     /* We could create this property. */
2635                     status = UX_SUCCESS;
2636 
2637                     /* Done here.  */
2638                     break;
2639 
2640 
2641                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NUMBER_OF_CHANNELS        :
2642 
2643                     /* Add the property code.  */
2644                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NUMBER_OF_CHANNELS);
2645 
2646                     /* Data type is UINT16.  */
2647                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT16);
2648 
2649                     /* GetSet value is GET.  */
2650                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2651 
2652                     /* Default value is UINT16.  */
2653                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2654 
2655                     /* Group code is 0.  */
2656                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 2, 0);
2657 
2658                     /* Form Flag ENUM.  */
2659                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 6) = 2;
2660 
2661                     /* Number of elements in Enum array.  */
2662                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 7, 3);
2663 
2664                     /* Elements in Enum array.  */
2665                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 0);
2666                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 11, 1);
2667                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 13, 2);
2668 
2669                     /* Set the length.  */
2670                     object_property_dataset_data_length = 20;
2671 
2672                     /* We could create this property. */
2673                     status = UX_SUCCESS;
2674 
2675                     /* Done here.  */
2676                     break;
2677 
2678 
2679                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_WAVE_CODEC        :
2680 
2681                     /* Add the property code.  */
2682                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_WAVE_CODEC);
2683 
2684                     /* Data type is UINT32.  */
2685                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2686 
2687                     /* GetSet value is GET.  */
2688                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2689 
2690                     /* Default value is UINT32.  */
2691                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2692 
2693                     /* Group code is 0.  */
2694                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 0);
2695 
2696                     /* Form Flag ENUM.  */
2697                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 2;
2698 
2699                     /* Number of elements in Enum array.  */
2700                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 3);
2701 
2702                     /* Elements in Enum array.  */
2703                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 11, UX_TEST_AUDIO_CODEC_WAVE_FORMAT_MPEGLAYER3);
2704                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 15, UX_TEST_AUDIO_CODEC_WAVE_FORMAT_MPEG);
2705                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 19, UX_TEST_AUDIO_CODEC_WAVE_FORMAT_RAW_AAC1);
2706 
2707                     /* Set the length.  */
2708                     object_property_dataset_data_length = 28;
2709 
2710                     /* We could create this property. */
2711                     status = UX_SUCCESS;
2712 
2713                     /* Done here.  */
2714                     break;
2715 
2716                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_BITRATE        :
2717 
2718                     /* Add the property code.  */
2719                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_BITRATE);
2720 
2721                     /* Data type is UINT32.  */
2722                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2723 
2724                     /* GetSet value is GET.  */
2725                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2726 
2727                     /* Default value is UINT32.  */
2728                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0x0000FA00);
2729 
2730                     /* Group code is 0.  */
2731                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 0);
2732 
2733                     /* Form Flag RANGE.  */
2734                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 1;
2735 
2736                     /* Minimum range in array is 1 bit per second.  */
2737                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 0x00000001);
2738 
2739                     /* Maximum range in array is 1,500,000 bit per second.  */
2740                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 13,0x0016E360 );
2741 
2742                     /* Range step size is 1 bit per second.  */
2743                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 17,0x00000001 );
2744 
2745                     /* Set the length.  */
2746                     object_property_dataset_data_length = 26;
2747 
2748                     /* We could create this property. */
2749                     status = UX_SUCCESS;
2750 
2751                     /* Done here.  */
2752                     break;
2753 
2754 
2755                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DURATION            :
2756 
2757                     /* Add the property code.  */
2758                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DURATION);
2759 
2760                     /* Data type is UINT32.  */
2761                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2762 
2763                     /* GetSet value is GET.  */
2764                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2765 
2766                     /* Default value is UINT32.  */
2767                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2768 
2769                     /* Group code is NULL.  */
2770                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 0);
2771 
2772                     /* Form Flag is 1.  */
2773                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 1;
2774 
2775                     /* Set the length.  */
2776                     object_property_dataset_data_length = 14;
2777 
2778                     /* We could create this property. */
2779                     status = UX_SUCCESS;
2780 
2781                     /* Done here.  */
2782                     break;
2783 
2784                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_WIDTH        :
2785 
2786                     /* Add the property code.  */
2787                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_WIDTH);
2788 
2789                     /* Data type is UINT16.  */
2790                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT16);
2791 
2792                     /* GetSet value is GET.  */
2793                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2794 
2795                     /* Default value is UINT16.  */
2796                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0x0000);
2797 
2798                     /* Group code is 0.  */
2799                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 2, 0);
2800 
2801                     /* Form Flag RANGE.  */
2802                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4) = 1;
2803 
2804                     /* Minimum range in array is customer defined.  */
2805                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5, 0x0000);
2806 
2807                     /* Maximum range in array is customer defined.  */
2808                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 7, 0x0000);
2809 
2810                     /* Range step size is customer defined.  */
2811                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 0x0000);
2812 
2813                     /* Set the length.  */
2814                     object_property_dataset_data_length = 11;
2815 
2816                     /* We could create this property. */
2817                     status = UX_SUCCESS;
2818 
2819                     /* Done here.  */
2820                     break;
2821 
2822                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_HEIGHT        :
2823 
2824                     /* Add the property code.  */
2825                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_HEIGHT);
2826 
2827                     /* Data type is UINT16.  */
2828                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT16);
2829 
2830                     /* GetSet value is GET.  */
2831                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2832 
2833                     /* Default value is UINT16.  */
2834                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0x0000);
2835 
2836                     /* Group code is 0.  */
2837                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 2, 0);
2838 
2839                     /* Form Flag RANGE.  */
2840                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4) = 1;
2841 
2842                     /* Minimum range in array is customer defined.  */
2843                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5, 0x0000);
2844 
2845                     /* Maximum range in array is customer defined.  */
2846                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 7, 0x0000);
2847 
2848                     /* Range step size is customer defined.  */
2849                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 0x0000);
2850 
2851                     /* Set the length.  */
2852                     object_property_dataset_data_length = 11;
2853 
2854                     /* We could create this property. */
2855                     status = UX_SUCCESS;
2856 
2857                     /* Done here.  */
2858                     break;
2859 
2860 
2861                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SCAN_TYPE        :
2862 
2863                     /* Add the property code.  */
2864                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SCAN_TYPE);
2865 
2866                     /* Data type is UINT16.  */
2867                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT16);
2868 
2869                     /* GetSet value is GET/SET.  */
2870                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2871 
2872                     /* Default value is UINT16.  */
2873                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2874 
2875                     /* Group code is 0.  */
2876                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 2, 2);
2877 
2878                     /* Form Flag ENUM.  */
2879                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 2;
2880 
2881                     /* Number of elements in Enum array.  */
2882                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 7, 8);
2883 
2884                     /* Elements in Enum array.  */
2885                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9,  0x0000);
2886                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 11, 0x0001);
2887                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 13, 0x0002);
2888                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 15, 0x0003);
2889                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 17, 0x0004);
2890                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 19, 0x0005);
2891                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 21, 0x0006);
2892                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 23, 0x0007);
2893 
2894                     /* Set the length.  */
2895                     object_property_dataset_data_length = 29;
2896 
2897                     /* We could create this property. */
2898                     status = UX_SUCCESS;
2899 
2900                     /* Done here.  */
2901                     break;
2902 
2903                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VIDEO_FOURCC_CODEC :
2904 
2905                     /* Add the property code.  */
2906                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VIDEO_FOURCC_CODEC);
2907 
2908                     /* Data type is UINT32.  */
2909                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2910 
2911                     /* GetSet value is GET/SET.  */
2912                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2913 
2914                     /* Default value is UINT32.  */
2915                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2916 
2917                     /* Group code is 0.  */
2918                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 2);
2919 
2920                     /* Form Flag ENUM.  */
2921                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 2;
2922 
2923                     /* Number of elements in Enum array.  */
2924                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 1);
2925 
2926                     /* Elements in Enum array.  */
2927                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 13,  0x00000000);
2928 
2929                     /* Set the length.  */
2930                     object_property_dataset_data_length = 22;
2931 
2932                     /* We could create this property. */
2933                     status = UX_SUCCESS;
2934 
2935                     /* Done here.  */
2936                     break;
2937 
2938                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VIDEO_BITRATE :
2939 
2940                     /* Add the property code.  */
2941                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VIDEO_BITRATE);
2942 
2943                     /* Data type is UINT32.  */
2944                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2945 
2946                     /* GetSet value is GET.  */
2947                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2948 
2949                     /* Default value is UINT32.  */
2950                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2951 
2952                     /* Group code is 0.  */
2953                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 2);
2954 
2955                     /* Form Flag RANGE.  */
2956                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 1;
2957 
2958                     /* Minimum range in array is 0.  */
2959                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 0x00000000);
2960 
2961                     /* Maximum range in array is 0xFFFFFFFF.  */
2962                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 13,0xFFFFFFFF );
2963 
2964                     /* Range step size is 1.  */
2965                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 17,0x00000001 );
2966 
2967                     /* Set the length.  */
2968                     object_property_dataset_data_length = 26;
2969 
2970                     /* We could create this property. */
2971                     status = UX_SUCCESS;
2972 
2973                     /* Done here.  */
2974                     break;
2975 
2976                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_FRAMES_PER_THOUSAND_SECONDS :
2977 
2978                     /* Add the property code.  */
2979                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_FRAMES_PER_THOUSAND_SECONDS);
2980 
2981                     /* Data type is UINT32.  */
2982                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2983 
2984                     /* GetSet value is GET/SET.  */
2985                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2986 
2987                     /* Default value is UINT32.  */
2988                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2989 
2990                     /* Group code is 0.  */
2991                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 2);
2992 
2993                     /* Form Flag ENUM.  */
2994                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 2;
2995 
2996                     /* Number of elements in Enum array.  */
2997                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 1);
2998 
2999                     /* Elements in Enum array.  */
3000                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 13,  0x00000000);
3001 
3002                     /* Set the length.  */
3003                     object_property_dataset_data_length = 22;
3004 
3005                     /* We could create this property. */
3006                     status = UX_SUCCESS;
3007 
3008                     /* Done here.  */
3009                     break;
3010 
3011                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_KEYFRAME_DISTANCE :
3012 
3013                     /* Add the property code.  */
3014                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_KEYFRAME_DISTANCE);
3015 
3016                     /* Data type is UINT32.  */
3017                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
3018 
3019                     /* GetSet value is GET/SET.  */
3020                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
3021 
3022                     /* Default value is UINT32.  */
3023                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
3024 
3025                     /* Group code is 0.  */
3026                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 2);
3027 
3028                     /* Form Flag RANGE.  */
3029                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 1;
3030 
3031                     /* Minimum range in array is 0.  */
3032                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 0x00000000);
3033 
3034                     /* Maximum range in array is FFFFFFFF.  */
3035                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 13,0x0000FFFF );
3036 
3037                     /* Range step size is 1.  */
3038                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 17,0x00000001 );
3039 
3040                     /* Set the length.  */
3041                     object_property_dataset_data_length = 26;
3042 
3043                     /* We could create this property. */
3044                     status = UX_SUCCESS;
3045 
3046                     /* Done here.  */
3047                     break;
3048 
3049                 case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ENCODING_PROFILE        :
3050 
3051                     /* Add the property code.  */
3052                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ENCODING_PROFILE);
3053 
3054                     /* Data type is STRING.  */
3055                     ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_STR);
3056 
3057                     /* GetSet value is GETSET.  */
3058                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
3059 
3060                     /* Store a empty Unicode string.   */
3061                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
3062 
3063                     /* Group code is NULL.  */
3064                     ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 0);
3065 
3066                     /* Form Flag is not used.  */
3067                     *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 0;
3068 
3069                     /* Set the length.  */
3070                     object_property_dataset_data_length = 11;
3071 
3072                     /* We could create this property. */
3073                     status = UX_SUCCESS;
3074 
3075                     /* Done here.  */
3076                     break;
3077 
3078                 default :
3079 
3080                     /* Error, prop code is not valid.  */
3081                     status = UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_PROP_CODE;
3082 
3083             }
3084 
3085         /* Check the status of the operation.  */
3086         if (status == UX_SUCCESS)
3087         {
3088 
3089             /* The property exist and its dataset created.  Return its pointer to MTP.  */
3090             *object_prop_dataset = object_property_dataset_data;
3091 
3092             /* And the length of the dataset.  */
3093             *object_prop_dataset_length = object_property_dataset_data_length;
3094 
3095             /* Done here.  */
3096             return(UX_SUCCESS);
3097         }
3098         else
3099 
3100             /* Done here. Return error.  */
3101             return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_PROP_CODE);
3102 
3103         break;
3104 
3105         default :
3106 
3107             /* We get here when we have the wrong format code.  */
3108             return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_FORMAT_CODE);
3109     }
3110 
3111 }
3112 
3113 
pima_device_object_prop_value_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handle,ULONG object_property,UCHAR ** object_prop_value,ULONG * object_prop_value_length)3114 UINT pima_device_object_prop_value_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
3115                                     ULONG object_handle,
3116                                     ULONG object_property,
3117                                     UCHAR **object_prop_value,
3118                                     ULONG *object_prop_value_length)
3119 {
3120 
3121 ULONG                               handle_index;
3122 UINT                                status;
3123 UCHAR                               *object_property_dataset_data;
3124 ULONG                               object_property_value_data_length;
3125 UX_SLAVE_CLASS_PIMA_OBJECT          *object;
3126 
3127     /* Check the object handle. It must be in the local array.  */
3128     status = pima_device_object_handle_check(object_handle, &object, &handle_index);
3129 
3130     /* Does the object handle exist ?  */
3131     if (status == UX_SUCCESS)
3132     {
3133 
3134         /* Set the pointer to the dataset_buffer.  */
3135         object_property_dataset_data = pima_device_object_property_dataset_data_buffer;
3136 
3137         /* Isolate the property. That will determine were we fetch the value.  We use the dataset storage area to build the value.  */
3138         switch (object_property)
3139         {
3140             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID            :
3141 
3142                 /* Copy the value itself.  */
3143                 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_storage_id);
3144 
3145                 /* Set the length.  */
3146                 object_property_value_data_length = 4;
3147 
3148                 /* We could create this property. */
3149                 status = UX_SUCCESS;
3150 
3151                 /* Done here.  */
3152                 break;
3153 
3154             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT        :
3155 
3156                 /* Copy the value itself.  */
3157                 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_format);
3158 
3159                 /* Set the length.  */
3160                 object_property_value_data_length = 2;
3161 
3162                 /* We could create this property. */
3163                 status = UX_SUCCESS;
3164 
3165                 /* Done here.  */
3166                 break;
3167 
3168             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS        :
3169 
3170                 /* Copy the value itself.  */
3171                 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_protection_status);
3172 
3173                 /* Set the length.  */
3174                 object_property_value_data_length = 2;
3175 
3176                 /* We could create this property. */
3177                 status = UX_SUCCESS;
3178 
3179                 /* Done here.  */
3180                 break;
3181 
3182             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE        :
3183 
3184                 /* Copy the value itself.  */
3185                 ux_utility_long_put(object_property_dataset_data , pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_size_low);
3186                 ux_utility_long_put(object_property_dataset_data  + 4, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_size_high);
3187 
3188                 /* Set the length.  */
3189                 object_property_value_data_length = 8;
3190 
3191                 /* We could create this property. */
3192                 status = UX_SUCCESS;
3193 
3194 
3195                 /* Done here.  */
3196                 break;
3197 
3198             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME    :
3199 
3200                 /* Store the file name in unicode format.  */
3201                 ux_utility_string_to_unicode(pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_file_name, object_property_dataset_data);
3202 
3203                 /* Set the length.  First Unicode string data.  */
3204                 object_property_value_data_length = (ULONG) *(object_property_dataset_data) * 2 + 1;
3205 
3206                 /* Done here.  */
3207                 break;
3208 
3209             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT        :
3210 
3211                 /* Copy the value itself.  */
3212                 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_parent_object);
3213 
3214                 /* Set the length.  */
3215                 object_property_value_data_length = 4;
3216 
3217                 /* We could create this property. */
3218                 status = UX_SUCCESS;
3219 
3220                 /* Done here.  */
3221                 break;
3222 
3223             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER        :
3224 
3225                 /* Copy the value itself.  */
3226                 ux_utility_memory_copy(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_persistent_unique_object_identifier,16);
3227 
3228                 /* Set the length.  */
3229                 object_property_value_data_length = 16;
3230 
3231                 /* We could create this property. */
3232                 status = UX_SUCCESS;
3233 
3234                 /* Done here.  */
3235                 break;
3236 
3237             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME    :
3238 
3239                 /* Store the file name in unicode format.  */
3240                 ux_utility_string_to_unicode(pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_name, object_property_dataset_data);
3241 
3242                 /* Set the length.  First Unicode string data.  */
3243                 object_property_value_data_length = (ULONG) *(object_property_dataset_data) * 2  + 1;
3244 
3245                 /* Done here.  */
3246                 break;
3247 
3248             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE        :
3249 
3250                 /* Copy the value itself.  */
3251                 *object_property_dataset_data = pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_non_consumable;
3252 
3253                 /* Set the length.  */
3254                 object_property_value_data_length = 1;
3255 
3256                 /* We could create this property. */
3257                 status = UX_SUCCESS;
3258 
3259                 /* Done here.  */
3260                 break;
3261 
3262             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ARTIST                :
3263 
3264                 /* Store the file name in unicode format.  */
3265                 ux_utility_string_to_unicode(pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_artist, object_property_dataset_data);
3266 
3267                 /* Set the length.  First Unicode string data.  */
3268                 object_property_value_data_length = (ULONG) *(object_property_dataset_data) * 2  + 1;
3269 
3270                 /* Done here.  */
3271                 break;
3272 
3273             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_TRACK        :
3274 
3275                 /* Copy the value itself.  */
3276                 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_track);
3277 
3278                 /* Set the length.  */
3279                 object_property_value_data_length = 2;
3280 
3281                 /* We could create this property. */
3282                 status = UX_SUCCESS;
3283 
3284                 /* Done here.  */
3285                 break;
3286 
3287             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_USE_COUNT        :
3288 
3289                 /* Copy the value itself.  */
3290                 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_use_count);
3291 
3292                 /* Set the length.  */
3293                 object_property_value_data_length = 2;
3294 
3295                 /* We could create this property. */
3296                 status = UX_SUCCESS;
3297 
3298                 /* Done here.  */
3299                 break;
3300 
3301             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DATE_AUTHORED        :
3302 
3303                 /* Store the file name in unicode format.  */
3304                 ux_utility_string_to_unicode(pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_date_authored, object_property_dataset_data);
3305 
3306                 /* Set the length.  First Unicode string data.  */
3307                 object_property_value_data_length = (ULONG) *(object_property_dataset_data) * 2  + 1;
3308 
3309                 /* Done here.  */
3310                 break;
3311 
3312             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE                :
3313 
3314                 /* Store the file name in unicode format.  */
3315                 ux_utility_string_to_unicode(pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_genre, object_property_dataset_data);
3316 
3317                 /* Set the length.  First Unicode string data.  */
3318                 object_property_value_data_length = (ULONG) *(object_property_dataset_data) * 2  + 1;
3319 
3320                 /* Done here.  */
3321                 break;
3322 
3323             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_NAME                :
3324 
3325                 /* Store the file name in unicode format.  */
3326                 ux_utility_string_to_unicode(pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_album_name, object_property_dataset_data);
3327 
3328                 /* Set the length.  First Unicode string data.  */
3329                 object_property_value_data_length = (ULONG) *(object_property_dataset_data) * 2  + 1;
3330 
3331                 /* Done here.  */
3332                 break;
3333 
3334             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_ARTIST                :
3335 
3336                 /* Store the file name in unicode format.  */
3337                 ux_utility_string_to_unicode(pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_album_artist, object_property_dataset_data);
3338 
3339                 /* Set the length.  First Unicode string data.  */
3340                 object_property_value_data_length = (ULONG) *(object_property_dataset_data) * 2  + 1;
3341 
3342                 /* Done here.  */
3343                 break;
3344 
3345             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SAMPLE_RATE        :
3346 
3347                 /* Copy the value itself.  */
3348                 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_sample_rate);
3349 
3350                 /* Set the length.  */
3351                 object_property_value_data_length = 2;
3352 
3353                 /* We could create this property. */
3354                 status = UX_SUCCESS;
3355 
3356                 /* Done here.  */
3357                 break;
3358 
3359             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NUMBER_OF_CHANNELS        :
3360 
3361                 /* Copy the value itself.  */
3362                 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_number_of_channels);
3363 
3364                 /* Set the length.  */
3365                 object_property_value_data_length = 2;
3366 
3367                 /* We could create this property. */
3368                 status = UX_SUCCESS;
3369 
3370                 /* Done here.  */
3371                 break;
3372 
3373             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_WAVE_CODEC        :
3374 
3375                 /* Copy the value itself.  */
3376                 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_audio_wave_codec);
3377 
3378                 /* Set the length.  */
3379                 object_property_value_data_length = 4;
3380 
3381                 /* We could create this property. */
3382                 status = UX_SUCCESS;
3383 
3384                 /* Done here.  */
3385                 break;
3386 
3387             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_BITRATE        :
3388 
3389                 /* Copy the value itself.  */
3390                 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_audio_bitrate);
3391 
3392                 /* Set the length.  */
3393                 object_property_value_data_length = 4;
3394 
3395                 /* We could create this property. */
3396                 status = UX_SUCCESS;
3397 
3398                 /* Done here.  */
3399                 break;
3400 
3401             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DURATION        :
3402 
3403                 /* Copy the value itself.  */
3404                 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_duration);
3405 
3406                 /* Set the length.  */
3407                 object_property_value_data_length = 4;
3408 
3409                 /* We could create this property. */
3410                 status = UX_SUCCESS;
3411 
3412                 /* Done here.  */
3413                 break;
3414 
3415             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_WIDTH            :
3416 
3417                 /* Copy the value itself.  */
3418                 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_width);
3419 
3420                 /* Set the length.  */
3421                 object_property_value_data_length = 2;
3422 
3423                 /* We could create this property. */
3424                 status = UX_SUCCESS;
3425 
3426                 /* Done here.  */
3427                 break;
3428 
3429             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_HEIGHT            :
3430 
3431                 /* Copy the value itself.  */
3432                 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_height);
3433 
3434                 /* Set the length.  */
3435                 object_property_value_data_length = 2;
3436 
3437                 /* We could create this property. */
3438                 status = UX_SUCCESS;
3439 
3440                 /* Done here.  */
3441                 break;
3442 
3443             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SCAN_TYPE            :
3444 
3445                 /* Copy the value itself.  */
3446                 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_scan_type);
3447 
3448                 /* Set the length.  */
3449                 object_property_value_data_length = 2;
3450 
3451                 /* We could create this property. */
3452                 status = UX_SUCCESS;
3453 
3454                 /* Done here.  */
3455                 break;
3456 
3457             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VIDEO_FOURCC_CODEC            :
3458 
3459                 /* Copy the value itself.  */
3460                 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_fourcc_codec);
3461 
3462                 /* Set the length.  */
3463                 object_property_value_data_length = 2;
3464 
3465                 /* We could create this property. */
3466                 status = UX_SUCCESS;
3467 
3468                 /* Done here.  */
3469                 break;
3470 
3471             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VIDEO_BITRATE            :
3472 
3473                 /* Copy the value itself.  */
3474                 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_video_bitrate);
3475 
3476                 /* Set the length.  */
3477                 object_property_value_data_length = 4;
3478 
3479                 /* We could create this property. */
3480                 status = UX_SUCCESS;
3481 
3482                 /* Done here.  */
3483                 break;
3484 
3485             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_FRAMES_PER_THOUSAND_SECONDS            :
3486 
3487                 /* Copy the value itself.  */
3488                 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_frames_per_thousand_seconds);
3489 
3490                 /* Set the length.  */
3491                 object_property_value_data_length = 4;
3492 
3493                 /* We could create this property. */
3494                 status = UX_SUCCESS;
3495 
3496                 /* Done here.  */
3497                 break;
3498 
3499             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_KEYFRAME_DISTANCE            :
3500 
3501                 /* Copy the value itself.  */
3502                 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_keyframe_distance);
3503 
3504                 /* Set the length.  */
3505                 object_property_value_data_length = 4;
3506 
3507                 /* We could create this property. */
3508                 status = UX_SUCCESS;
3509 
3510                 /* Done here.  */
3511                 break;
3512 
3513             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ENCODING_PROFILE            :
3514 
3515                 /* Store the file name in unicode format.  */
3516                 ux_utility_string_to_unicode(pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_encoding_profile, object_property_dataset_data);
3517 
3518                 /* Set the length.  First Unicode string data.  */
3519                 object_property_value_data_length = (ULONG) *(object_property_dataset_data) * 2  + 1;
3520 
3521                 /* Done here.  */
3522                 break;
3523 
3524             default :
3525 
3526                 /* Error, prop code is not valid.  */
3527                 status =  UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_PROP_CODE;
3528 
3529         }
3530 
3531         /* Check the status of the operation.  */
3532         if (status == UX_SUCCESS)
3533         {
3534 
3535             /* The property exist and its value created.  Return its pointer to MTP.  */
3536             *object_prop_value = object_property_dataset_data;
3537 
3538             /* And the length of the dataset.  */
3539             *object_prop_value_length = object_property_value_data_length;
3540 
3541             /* Done here.  */
3542             return(UX_SUCCESS);
3543         }
3544         else
3545 
3546             /* Done here. Return error.  */
3547             return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_PROP_CODE);
3548     }
3549     else
3550 
3551         /* Done here. Return error.  */
3552         return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_HANDLE);
3553 }
3554 
3555 
pima_device_object_prop_value_set(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handle,ULONG object_property,UCHAR * object_prop_value,ULONG object_prop_value_length)3556 UINT pima_device_object_prop_value_set (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
3557                                     ULONG object_handle,
3558                                     ULONG object_property,
3559                                     UCHAR *object_prop_value,
3560                                     ULONG object_prop_value_length)
3561 {
3562 
3563 ULONG                               handle_index;
3564 UINT                                status;
3565 UX_SLAVE_CLASS_PIMA_OBJECT          *object;
3566 
3567     /* Check the object handle. It must be in the local array.  */
3568     status = pima_device_object_handle_check(object_handle, &object, &handle_index);
3569 
3570     /* Does the object handle exist ?  */
3571     if (status == UX_SUCCESS)
3572     {
3573 
3574         /* Isolate the property.  This is SET. So the properties that are GET only will not be changed.  */
3575         switch (object_property)
3576         {
3577             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID            :
3578             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT        :
3579             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE        :
3580             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT        :
3581             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DURATION            :
3582 
3583                 /* Object is write protected.  */
3584                 status = UX_DEVICE_CLASS_PIMA_RC_OBJECT_WRITE_PROTECTED;
3585 
3586                 /* Done here.  */
3587                 break;
3588 
3589             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME    :
3590 
3591                 /* Copy the file name after translate from Unicode to ASCIIZ. */
3592                 ux_utility_unicode_to_string(object_prop_value, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_file_name);
3593 
3594                 /* We could set this property. */
3595                 status = UX_SUCCESS;
3596 
3597                 /* Done here.  */
3598                 break;
3599 
3600             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME    :
3601 
3602                 /* Copy the name after translate from Unicode to ASCIIZ. */
3603                 ux_utility_unicode_to_string(object_prop_value, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_name);
3604 
3605                 /* We could set this property. */
3606                 status = UX_SUCCESS;
3607 
3608                 /* Done here.  */
3609                 break;
3610 
3611             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ARTIST                :
3612 
3613                 /* Copy the artist name after translate from Unicode to ASCIIZ. */
3614                 ux_utility_unicode_to_string(object_prop_value, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_artist);
3615 
3616                 /* We could set this property. */
3617                 status = UX_SUCCESS;
3618 
3619                 break;
3620 
3621             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DATE_AUTHORED        :
3622 
3623                 /* Copy the date authored after translate from Unicode to ASCIIZ. */
3624                 ux_utility_unicode_to_string(object_prop_value, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_date_authored);
3625 
3626                 /* We could set this property. */
3627                 status = UX_SUCCESS;
3628 
3629                 /* Done here.  */
3630                 break;
3631 
3632             case    UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE                :
3633 
3634                 /* Copy the genre after translate from Unicode to ASCIIZ. */
3635                 ux_utility_unicode_to_string(object_prop_value, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_genre);
3636 
3637                 /* We could set this property. */
3638                 status = UX_SUCCESS;
3639 
3640                 /* Done here.  */
3641                 break;
3642 
3643             default :
3644 
3645                 /* Error, prop code is not valid.  */
3646                 status = UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_PROP_CODE;
3647         }
3648 
3649 
3650         /* Done here. Return status.  */
3651         return(status);
3652     }
3653     else
3654 
3655         /* Done here. Return error.  */
3656         return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_HANDLE);
3657 }
3658 
3659 
pima_device_object_references_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handle,UCHAR ** object_references_array,ULONG * object_references_array_length)3660 UINT pima_device_object_references_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
3661                                     ULONG object_handle,
3662                                     UCHAR **object_references_array,
3663                                     ULONG *object_references_array_length)
3664 {
3665 
3666 ULONG                               handle_index;
3667 UINT                                status;
3668 UX_SLAVE_CLASS_PIMA_OBJECT          *object;
3669 ULONG                               references_array;
3670 
3671     /* Check the object handle. It must be in the local array.  */
3672     status = pima_device_object_handle_check(object_handle, &object, &handle_index);
3673 
3674     /* Does the object handle exist ?  */
3675     if (status == UX_SUCCESS)
3676     {
3677 
3678         /* The property exist. Not sure what to do with references in this release.
3679            Here we simply create an empty array. */
3680            references_array = 0;
3681 
3682            /* Return its pointer to MTP.  */
3683         *object_references_array = (UCHAR *) &references_array;
3684 
3685         /* And the length of the dataset.  */
3686         *object_references_array_length = sizeof(ULONG);
3687 
3688         /* Done here.  */
3689         return(UX_SUCCESS);
3690 
3691     }
3692 
3693     else
3694 
3695         /* Done here. Return error.  */
3696         return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_HANDLE);
3697 }
3698 
3699 
pima_device_object_references_set(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handle,UCHAR * object_references_array,ULONG object_references_array_length)3700 UINT pima_device_object_references_set (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
3701                                     ULONG object_handle,
3702                                     UCHAR *object_references_array,
3703                                     ULONG object_references_array_length)
3704 {
3705 
3706 ULONG                               handle_index;
3707 UINT                                status;
3708 UX_SLAVE_CLASS_PIMA_OBJECT          *object;
3709 
3710     /* Check the object handle. It must be in the local array.  */
3711     status = pima_device_object_handle_check(object_handle, &object, &handle_index);
3712 
3713     /* Does the object handle exist ?  */
3714     if (status == UX_SUCCESS)
3715     {
3716 
3717         /* The property exist. Not sure what to do with references in this release. */
3718 
3719         /* Done here.  */
3720         return(UX_SUCCESS);
3721 
3722     }
3723 
3724     else
3725 
3726         /* Done here. Return error.  */
3727         return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_HANDLE);
3728 }
3729 
3730 
pima_device_object_handle_check(ULONG object_handle,UX_SLAVE_CLASS_PIMA_OBJECT ** object,ULONG * caller_handle_index)3731 UINT pima_device_object_handle_check(ULONG object_handle,
3732                                     UX_SLAVE_CLASS_PIMA_OBJECT **object,
3733                                     ULONG *caller_handle_index)
3734 {
3735 ULONG                               handle_index;
3736 
3737     /* Parse all the handles we have in the media.  */
3738     for (handle_index = 0; handle_index < UX_TEST_MAX_HANDLES; handle_index++)
3739     {
3740 
3741         /* Check if we have the correct handle. */
3742         if (pima_device_object_number_handles_array[handle_index] == object_handle)
3743         {
3744 
3745             /* We have found the right handle.  Now retrieve its object info dataset. */
3746             *object = &pima_device_object_info_array[handle_index];
3747 
3748             /* Update the caller index.  */
3749             *caller_handle_index = handle_index;
3750 
3751             /* We are done here.  Return success.  */
3752             return(UX_SUCCESS);
3753         }
3754     }
3755 
3756     /* We get here when the handle is unknown. Return error.  */
3757     return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_HANDLE);
3758 
3759 }
3760