1 /***************************************************************************
2  * Copyright (c) 2024 Microsoft Corporation
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the MIT License which is available at
6  * https://opensource.org/licenses/MIT.
7  *
8  * SPDX-License-Identifier: MIT
9  **************************************************************************/
10 
11 /**************************************************************************/
12 /**************************************************************************/
13 /**                                                                       */
14 /** USBX Component                                                        */
15 /**                                                                       */
16 /**   Device PIMA Class                                                   */
17 /**                                                                       */
18 /**************************************************************************/
19 /**************************************************************************/
20 
21 #define UX_SOURCE_CODE
22 
23 
24 /* Include necessary system files.  */
25 
26 #include "ux_api.h"
27 #include "ux_device_class_pima.h"
28 #include "ux_device_stack.h"
29 
30 
31 /**************************************************************************/
32 /*                                                                        */
33 /*  FUNCTION                                               RELEASE        */
34 /*                                                                        */
35 /*    ux_device_class_pima_data.c                         PORTABLE C      */
36 /*                                                           6.1          */
37 /*  AUTHOR                                                                */
38 /*                                                                        */
39 /*    Chaoqiong Xiao, Microsoft Corporation                               */
40 /*                                                                        */
41 /*  DESCRIPTION                                                           */
42 /*                                                                        */
43 /*    This module contains all the data definition used by the PIMA       */
44 /*    device class.                                                       */
45 /*                                                                        */
46 /*  INPUT                                                                 */
47 /*                                                                        */
48 /*  OUTPUT                                                                */
49 /*                                                                        */
50 /*  CALLS                                                                 */
51 /*                                                                        */
52 /*    None                                                                */
53 /*                                                                        */
54 /*  CALLED BY                                                             */
55 /*                                                                        */
56 /*                                                                        */
57 /*  RELEASE HISTORY                                                       */
58 /*                                                                        */
59 /*    DATE              NAME                      DESCRIPTION             */
60 /*                                                                        */
61 /*  05-19-2020     Chaoqiong Xiao           Initial Version 6.0           */
62 /*  09-30-2020     Chaoqiong Xiao           Modified comment(s),          */
63 /*                                            resulting in version 6.1    */
64 /*                                                                        */
65 /**************************************************************************/
66 
67 /* Define PIMA vendor extension descriptor. This is a regular string that needs to be put into unicode. */
68 UCHAR _ux_device_class_pima_vendor_extension_descriptor[] =     {
69 #ifdef UX_PIMA_WITH_MTP_SUPPORT
70                                                                 "microsoft.com: 1.0;  microsoft.com/WMPPD: 11.0; microsoft.com/WMPPD: 10.0; microsoft.com/WMDRMPD: 10.1;"
71 #else
72                                                                 0
73 #endif
74                                                                 };
75 
76 /* Define PIMA supported operations. The last entry MUST be a zero. The DeviceInfoSet command
77    will parse this array and compute the number of functions supported and return it to the
78    host.  */
79 
80 USHORT _ux_device_class_pima_supported_operations[] =            {
81 
82                                                                 UX_DEVICE_CLASS_PIMA_OC_GET_DEVICE_INFO,
83                                                                 UX_DEVICE_CLASS_PIMA_OC_OPEN_SESSION,
84                                                                 UX_DEVICE_CLASS_PIMA_OC_CLOSE_SESSION,
85                                                                 UX_DEVICE_CLASS_PIMA_OC_GET_STORAGE_IDS,
86                                                                 UX_DEVICE_CLASS_PIMA_OC_GET_STORAGE_INFO,
87                                                                 UX_DEVICE_CLASS_PIMA_OC_GET_NUM_OBJECTS,
88                                                                 UX_DEVICE_CLASS_PIMA_OC_GET_OBJECT_HANDLES,
89                                                                 UX_DEVICE_CLASS_PIMA_OC_GET_OBJECT_INFO,
90                                                                 UX_DEVICE_CLASS_PIMA_OC_GET_OBJECT,
91                                                                 UX_DEVICE_CLASS_PIMA_OC_GET_THUMB,
92                                                                 UX_DEVICE_CLASS_PIMA_OC_GET_PARTIAL_OBJECT,
93                                                                 UX_DEVICE_CLASS_PIMA_OC_DELETE_OBJECT,
94                                                                 UX_DEVICE_CLASS_PIMA_OC_SEND_OBJECT_INFO,
95                                                                 UX_DEVICE_CLASS_PIMA_OC_SEND_OBJECT,
96                                                                 UX_DEVICE_CLASS_PIMA_OC_INITIATE_CAPTURE,
97                                                                 UX_DEVICE_CLASS_PIMA_OC_FORMAT_STORE,
98                                                                 UX_DEVICE_CLASS_PIMA_OC_RESET_DEVICE,
99 #ifdef UX_PIMA_WITH_MTP_SUPPORT
100                                                                 UX_DEVICE_CLASS_PIMA_OC_GET_OBJECT_PROPS_SUPPORTED,
101                                                                 UX_DEVICE_CLASS_PIMA_OC_GET_OBJECT_PROP_DESC,
102                                                                 UX_DEVICE_CLASS_PIMA_OC_GET_OBJECT_PROP_VALUE,
103                                                                 UX_DEVICE_CLASS_PIMA_OC_SET_OBJECT_PROP_VALUE,
104                                                                 UX_DEVICE_CLASS_PIMA_OC_GET_OBJECT_REFERENCES,
105                                                                 UX_DEVICE_CLASS_PIMA_OC_SET_OBJECT_REFERENCES,
106 #endif
107                                                                 0
108                                                                 };
109 
110 
111 /* Define PIMA supported events. The last entry MUST be a zero. The DeviceInfoSet command
112    will parse this array and compute the number of functions supported and return it to the
113    host.  */
114 
115 USHORT _ux_device_class_pima_supported_events[] =                {
116 
117                                                                 UX_DEVICE_CLASS_PIMA_EC_CANCEL_TRANSACTION,
118                                                                 UX_DEVICE_CLASS_PIMA_EC_OBJECT_ADDED,
119                                                                 UX_DEVICE_CLASS_PIMA_EC_OBJECT_REMOVED,
120                                                                 UX_DEVICE_CLASS_PIMA_EC_STORE_ADDED,
121                                                                 UX_DEVICE_CLASS_PIMA_EC_STORE_REMOVED,
122                                                                 UX_DEVICE_CLASS_PIMA_EC_DEVICE_PROP_CHANGED,
123                                                                 UX_DEVICE_CLASS_PIMA_EC_OBJECT_INFO_CHANGED,
124                                                                 UX_DEVICE_CLASS_PIMA_EC_DEVICE_INFO_CHANGED,
125                                                                 UX_DEVICE_CLASS_PIMA_EC_REQUEST_OBJECT_TRANSFER,
126                                                                 UX_DEVICE_CLASS_PIMA_EC_STORE_FULL,
127                                                                 UX_DEVICE_CLASS_PIMA_EC_DEVICE_RESET,
128                                                                 UX_DEVICE_CLASS_PIMA_EC_STORAGE_INFO_CHANGED,
129                                                                 UX_DEVICE_CLASS_PIMA_EC_CAPTURE_COMPLETE,
130                                                                 UX_DEVICE_CLASS_PIMA_EC_UNREPORTED_STATUS,
131                                                                 0
132                                                                 };
133 
134 /* Define PIMA supported device properties. The last entry MUST be a zero. The DeviceInfoSet command
135    will parse this array and compute the number of functions supported and return it to the
136    host.  For each declared device property, a dataset must be created in the application.
137    This table is used is the application has not defined any device properties. */
138 USHORT _ux_device_class_pima_device_prop_supported[] =   {
139 
140                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_UNDEFINED,
141                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_BATTERY_LEVEL,
142                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_FUNCTIONAL_MODE,
143                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_IMAGE_SIZE,
144                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_COMPRESSION_SETTING,
145                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_WHITE_BALANCE,
146                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_RGB_GAIN,
147                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_F_NUMBER,
148                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_FOCAL_LENGTH,
149                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_FOCUS_DISTANCE,
150                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_FOCUS_MODE,
151                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_EXPOSURE_METERING_MODE,
152                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_FLASH_MODE,
153                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_EXPOSURE_TIME,
154                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_EXPOSURE_PROGRAM_MODE,
155                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_EXPOSURE_INDEX,
156                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_EXPOSURE_BIAS_COMPENSATION,
157                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_DATE_TIME,
158                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_CAPTURE_DELAY,
159                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_STILL_CAPTURE_MODE,
160                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_CONTRAST,
161                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_SHARPNESS,
162                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_DIGITAL_ZOOM,
163                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_EFFECT_MODE,
164                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_BURST_NUMBER,
165                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_BURST_INTERVAL,
166                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_TIME_LAPSE_NUMBER,
167                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_TIME_LAPSE_INTERVAL,
168                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_FOCUS_METERING_MODE,
169                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_UPLOAD_URL,
170                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_ARTIST,
171                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_COPYRIGHT_INFO,
172 #ifdef UX_PIMA_WITH_MTP_SUPPORT
173                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_SYNCHRONIZATION_PARTNER,
174                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_DEVICE_FRIENDLY_NAME,
175                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_VOLUME,
176                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_SUPPORTED_FORMATS_ORDERED,
177                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_DEVICE_ICON,
178                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_PLAYBACK_RATE,
179                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_PLAYBACK_OBJECT,
180                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_PLAYBACK_CONTAINER,
181                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_SESSION_INITIATOR_VERSION_INFO,
182                                                                 UX_DEVICE_CLASS_PIMA_DEV_PROP_PERCEIVED_DEVICE_TYPE,
183 #endif
184                                                                 0
185     };
186 
187 /* Define PIMA supported capture formats. The last entry MUST be a zero. The DeviceInfoSet command
188    will parse this array and compute the number of functions supported and return it to the
189    host.
190    This table is used is the application has not defined any capture formats. */
191 USHORT _ux_device_class_pima_supported_capture_formats[] =       {
192                                                                 0
193                                                                 };
194 
195 /* Define PIMA supported image formats. The last entry MUST be a zero. The DeviceInfoSet command
196    will parse this array and compute the number of formats supported and return it to the
197    host.
198    This table is used is the application has not defined any capture formats. */
199 USHORT _ux_device_class_pima_supported_image_formats[] =        {
200                                                                 UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED,
201                                                                 UX_DEVICE_CLASS_PIMA_OFC_ASSOCIATION,
202                                                                 UX_DEVICE_CLASS_PIMA_OFC_SCRIPT,
203                                                                 UX_DEVICE_CLASS_PIMA_OFC_EXECUTABLE,
204                                                                 UX_DEVICE_CLASS_PIMA_OFC_TEXT,
205                                                                 UX_DEVICE_CLASS_PIMA_OFC_HTML,
206                                                                 UX_DEVICE_CLASS_PIMA_OFC_DPOF,
207                                                                 UX_DEVICE_CLASS_PIMA_OFC_AIFF,
208                                                                 UX_DEVICE_CLASS_PIMA_OFC_WAV,
209                                                                 UX_DEVICE_CLASS_PIMA_OFC_MP3,
210                                                                 UX_DEVICE_CLASS_PIMA_OFC_AVI,
211                                                                 UX_DEVICE_CLASS_PIMA_OFC_MPEG,
212                                                                 UX_DEVICE_CLASS_PIMA_OFC_ASF,
213                                                                 UX_DEVICE_CLASS_PIMA_OFC_DEFINED,
214                                                                 UX_DEVICE_CLASS_PIMA_OFC_EXIF_JPEG,
215                                                                 UX_DEVICE_CLASS_PIMA_OFC_TIFF_EP,
216                                                                 UX_DEVICE_CLASS_PIMA_OFC_FLASHPIX,
217                                                                 UX_DEVICE_CLASS_PIMA_OFC_BMP,
218                                                                 UX_DEVICE_CLASS_PIMA_OFC_CIFF,
219                                                                 UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED,
220                                                                 UX_DEVICE_CLASS_PIMA_OFC_GIF,
221                                                                 UX_DEVICE_CLASS_PIMA_OFC_JFIF,
222                                                                 UX_DEVICE_CLASS_PIMA_OFC_CD,
223                                                                 UX_DEVICE_CLASS_PIMA_OFC_PICT,
224                                                                 UX_DEVICE_CLASS_PIMA_OFC_PNG,
225                                                                 UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED,
226                                                                 UX_DEVICE_CLASS_PIMA_OFC_TIFF,
227                                                                 UX_DEVICE_CLASS_PIMA_OFC_TIFF_IT,
228                                                                 UX_DEVICE_CLASS_PIMA_OFC_JP2,
229                                                                 UX_DEVICE_CLASS_PIMA_OFC_JPX,
230 #ifdef UX_PIMA_WITH_MTP_SUPPORT
231                                                                 UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_FIRMWARE,
232                                                                 UX_DEVICE_CLASS_PIMA_OFC_WINDOWS_IMAGE_FORMAT,
233                                                                 UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_AUDIO,
234                                                                 UX_DEVICE_CLASS_PIMA_OFC_WMA,
235                                                                 UX_DEVICE_CLASS_PIMA_OFC_OGG,
236                                                                 UX_DEVICE_CLASS_PIMA_OFC_AAC,
237                                                                 UX_DEVICE_CLASS_PIMA_OFC_AUDIBLE,
238                                                                 UX_DEVICE_CLASS_PIMA_OFC_FLAC,
239                                                                 UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_VIDEO,
240                                                                 UX_DEVICE_CLASS_PIMA_OFC_WMV,
241                                                                 UX_DEVICE_CLASS_PIMA_OFC_MP4_CONTAINER,
242                                                                 UX_DEVICE_CLASS_PIMA_OFC_MP2,
243                                                                 UX_DEVICE_CLASS_PIMA_OFC_3GP_CONTAINER,
244                                                                 UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_COLLECTION,
245                                                                 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_MULTIMEDIA_ALBUM,
246                                                                 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_IMAGE_ALBUM,
247                                                                 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_AUDIO_ALBUM,
248                                                                 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_VIDEO_ALBUM,
249                                                                 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_AUDIO_AND_VIDEO_PLAYLIST,
250                                                                 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_CONTACT_GROUP,
251                                                                 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_MESSAGE_FOLDER,
252                                                                 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_CHAPTERED_PRODUCTION,
253                                                                 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_AUDIO_PLAYLIST,
254                                                                 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_VIDEO_PLAYLIST,
255                                                                 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_MEDIACAST,
256                                                                 UX_DEVICE_CLASS_PIMA_OFC_WPL_PLAYLIST,
257                                                                 UX_DEVICE_CLASS_PIMA_OFC_M3U_PLAYLIST,
258                                                                 UX_DEVICE_CLASS_PIMA_OFC_MPL_PLAYLIST,
259                                                                 UX_DEVICE_CLASS_PIMA_OFC_ASX_PLAYLIST,
260                                                                 UX_DEVICE_CLASS_PIMA_OFC_PLS_PLAYLIST,
261                                                                 UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_DOCUMENT,
262                                                                 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_DOCUMENT,
263                                                                 UX_DEVICE_CLASS_PIMA_OFC_XML_DOCUMENT,
264                                                                 UX_DEVICE_CLASS_PIMA_OFC_MICROSOFT_WORD_DOCUMENT,
265                                                                 UX_DEVICE_CLASS_PIMA_OFC_MHT_COMPILED_HTML_DOCUMENT,
266                                                                 UX_DEVICE_CLASS_PIMA_OFC_MICROSOFT_EXCEL_SPREADSHEET,
267                                                                 UX_DEVICE_CLASS_PIMA_OFC_MICROSOFT_POWERPOINT_PRESENTATION,
268                                                                 UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_MESSAGE,
269                                                                 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_MESSAGE,
270                                                                 UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_CONTACT,
271                                                                 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_CONTACT,
272                                                                 UX_DEVICE_CLASS_PIMA_OFC_VCARD2,
273 #endif
274                                                                 0
275                                                                 };
276