1 /* 2 * Copyright (C) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #define MLOG_TAG "MtpPacketTool" 16 #include "mtp_packet_tools.h" 17 #include <codecvt> 18 #include <cctype> 19 #include <cinttypes> 20 #include <cstdlib> 21 #include <locale> 22 #include "media_log.h" 23 #include "mtp_packet.h" 24 #include "securec.h" 25 #include "parameters.h" 26 #include "media_mtp_utils.h" 27 namespace OHOS { 28 namespace Media { 29 namespace { 30 // these numbers are defined by protocol, have no exact meaning 31 static const int BUF_07 = 0x07; 32 static const int BUF_0F = 0x0F; 33 34 static const int BEGIN_YEAR = 1900; 35 static const int DUMP_HEXBUF_MAX = 128; 36 static const int DUMP_TXTBUF_MAX = 32; 37 static const int MAX_LENGTH = 255; 38 static const int TIME_LENGTH = 20; 39 static const std::string BLANK_STR = " "; 40 static const std::string INDENT_BLANKSTR = " "; 41 static const int INDENT_SIZE = INDENT_BLANKSTR.length(); 42 static const std::string DATE_TIME_INIT = "19700101T080000"; 43 static const std::string UNKNOWN_STR = "Unknown"; 44 static const char *UTF16_CERROR = "__CONVERSION_ERROR__"; 45 static const char16_t *UTF8_CERROR = u"__CONVERSION_ERROR__"; 46 static const std::string KEY_MTP_SHOW_DUMP = "multimedia.medialibrary.mtp_show_dump"; 47 static const std::string MTP_SHOW_DUMP_DEFAULT = "0"; 48 static const std::string ALLOW_SHOW_DUMP = "1"; 49 50 static const std::map<uint32_t, std::string> AssociationMap = { 51 { MTP_ASSOCIATION_TYPE_UNDEFINED_CODE, "MTP_ASSOCIATION_TYPE_UNDEFINED" }, 52 { MTP_ASSOCIATION_TYPE_GENERIC_FOLDER_CODE, "MTP_ASSOCIATION_TYPE_GENERIC_FOLDER" }, 53 }; 54 55 static const std::map<uint32_t, std::string> OperationMap = { 56 { MTP_OPERATION_GET_DEVICE_INFO_CODE, "MTP_OPERATION_GET_DEVICE_INFO" }, 57 { MTP_OPERATION_OPEN_SESSION_CODE, "MTP_OPERATION_OPEN_SESSION" }, 58 { MTP_OPERATION_CLOSE_SESSION_CODE, "MTP_OPERATION_CLOSE_SESSION" }, 59 { MTP_OPERATION_GET_STORAGE_IDS_CODE, "MTP_OPERATION_GET_STORAGE_IDS" }, 60 { MTP_OPERATION_GET_STORAGE_INFO_CODE, "MTP_OPERATION_GET_STORAGE_INFO" }, 61 { MTP_OPERATION_GET_NUM_OBJECTS_CODE, "MTP_OPERATION_GET_NUM_OBJECTS" }, 62 { MTP_OPERATION_GET_OBJECT_HANDLES_CODE, "MTP_OPERATION_GET_OBJECT_HANDLES" }, 63 { MTP_OPERATION_GET_OBJECT_INFO_CODE, "MTP_OPERATION_GET_OBJECT_INFO" }, 64 { MTP_OPERATION_GET_OBJECT_CODE, "MTP_OPERATION_GET_OBJECT" }, 65 { MTP_OPERATION_GET_THUMB_CODE, "MTP_OPERATION_GET_THUMB" }, 66 { MTP_OPERATION_DELETE_OBJECT_CODE, "MTP_OPERATION_DELETE_OBJECT" }, 67 { MTP_OPERATION_SEND_OBJECT_INFO_CODE, "MTP_OPERATION_SEND_OBJECT_INFO" }, 68 { MTP_OPERATION_SEND_OBJECT_CODE, "MTP_OPERATION_SEND_OBJECT" }, 69 { MTP_OPERATION_INITIATE_CAPTURE_CODE, "MTP_OPERATION_INITIATE_CAPTURE" }, 70 { MTP_OPERATION_FORMAT_STORE_CODE, "MTP_OPERATION_FORMAT_STORE" }, 71 { MTP_OPERATION_RESET_DEVICE_CODE, "MTP_OPERATION_RESET_DEVICE" }, 72 { MTP_OPERATION_SELF_TEST_CODE, "MTP_OPERATION_SELF_TEST" }, 73 { MTP_OPERATION_SET_OBJECT_PROTECTION_CODE, "MTP_OPERATION_SET_OBJECT_PROTECTION" }, 74 { MTP_OPERATION_POWER_DOWN_CODE, "MTP_OPERATION_POWER_DOWN" }, 75 { MTP_OPERATION_GET_DEVICE_PROP_DESC_CODE, "MTP_OPERATION_GET_DEVICE_PROP_DESC" }, 76 { MTP_OPERATION_GET_DEVICE_PROP_VALUE_CODE, "MTP_OPERATION_GET_DEVICE_PROP_VALUE" }, 77 { MTP_OPERATION_SET_DEVICE_PROP_VALUE_CODE, "MTP_OPERATION_SET_DEVICE_PROP_VALUE" }, 78 { MTP_OPERATION_RESET_DEVICE_PROP_VALUE_CODE, "MTP_OPERATION_RESET_DEVICE_PROP_VALUE" }, 79 { MTP_OPERATION_TERMINATE_OPEN_CAPTURE_CODE, "MTP_OPERATION_TERMINATE_OPEN_CAPTURE" }, 80 { MTP_OPERATION_MOVE_OBJECT_CODE, "MTP_OPERATION_MOVE_OBJECT" }, 81 { MTP_OPERATION_COPY_OBJECT_CODE, "MTP_OPERATION_COPY_OBJECT" }, 82 { MTP_OPERATION_GET_PARTIAL_OBJECT_CODE, "MTP_OPERATION_GET_PARTIAL_OBJECT" }, 83 { MTP_OPERATION_INITIATE_OPEN_CAPTURE_CODE, "MTP_OPERATION_INITIATE_OPEN_CAPTURE" }, 84 { MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED_CODE, "MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED" }, 85 { MTP_OPERATION_GET_OBJECT_PROP_DESC_CODE, "MTP_OPERATION_GET_OBJECT_PROP_DESC" }, 86 { MTP_OPERATION_GET_OBJECT_PROP_VALUE_CODE, "MTP_OPERATION_GET_OBJECT_PROP_VALUE" }, 87 { MTP_OPERATION_SET_OBJECT_PROP_VALUE_CODE, "MTP_OPERATION_SET_OBJECT_PROP_VALUE" }, 88 { MTP_OPERATION_GET_OBJECT_PROP_LIST_CODE, "MTP_OPERATION_GET_OBJECT_PROP_LIST" }, 89 { MTP_OPERATION_SET_OBJECT_PROP_LIST_CODE, "MTP_OPERATION_SET_OBJECT_PROP_LIST" }, 90 { MTP_OPERATION_GET_INTERDEPENDENT_PROPDESC_CODE, "MTP_OPERATION_GET_INTERDEPENDENT_PROP_DESC" }, 91 { MTP_OPERATION_SEND_OBJECT_PROP_LIST_CODE, "MTP_OPERATION_SEND_OBJECT_PROP_LIST" }, 92 { MTP_OPERATION_GET_OBJECT_REFERENCES_CODE, "MTP_OPERATION_GET_OBJECT_REFERENCES" }, 93 { MTP_OPERATION_SET_OBJECT_REFERENCES_CODE, "MTP_OPERATION_SET_OBJECT_REFERENCES" }, 94 { MTP_OPERATION_SKIP_CODE, "MTP_OPERATION_SKIP" }, 95 }; 96 97 static const std::map<uint32_t, std::string> FormatMap = { 98 { MTP_FORMAT_UNDEFINED_CODE, "MTP_FORMAT_UNDEFINED" }, 99 { MTP_FORMAT_ASSOCIATION_CODE, "MTP_FORMAT_ASSOCIATION" }, 100 { MTP_FORMAT_SCRIPT_CODE, "MTP_FORMAT_SCRIPT" }, 101 { MTP_FORMAT_EXECUTABLE_CODE, "MTP_FORMAT_EXECUTABLE" }, 102 { MTP_FORMAT_TEXT_CODE, "MTP_FORMAT_TEXT" }, 103 { MTP_FORMAT_HTML_CODE, "MTP_FORMAT_HTML" }, 104 { MTP_FORMAT_DPOF_CODE, "MTP_FORMAT_DPOF" }, 105 { MTP_FORMAT_AIFF_CODE, "MTP_FORMAT_AIFF" }, 106 { MTP_FORMAT_WAV_CODE, "MTP_FORMAT_WAV" }, 107 { MTP_FORMAT_MP3_CODE, "MTP_FORMAT_MP3" }, 108 { MTP_FORMAT_AVI_CODE, "MTP_FORMAT_AVI" }, 109 { MTP_FORMAT_MPEG_CODE, "MTP_FORMAT_MPEG" }, 110 { MTP_FORMAT_ASF_CODE, "MTP_FORMAT_ASF" }, 111 { MTP_FORMAT_DEFINED_CODE, "MTP_FORMAT_DEFINED" }, 112 { MTP_FORMAT_EXIF_JPEG_CODE, "MTP_FORMAT_EXIF_JPEG" }, 113 { MTP_FORMAT_TIFF_EP_CODE, "MTP_FORMAT_TIFF_EP" }, 114 { MTP_FORMAT_FLASHPIX_CODE, "MTP_FORMAT_FLASHPIX" }, 115 { MTP_FORMAT_BMP_CODE, "MTP_FORMAT_BMP" }, 116 { MTP_FORMAT_CIFF_CODE, "MTP_FORMAT_CIFF" }, 117 { MTP_FORMAT_GIF_CODE, "MTP_FORMAT_GIF" }, 118 { MTP_FORMAT_JFIF_CODE, "MTP_FORMAT_JFIF" }, 119 { MTP_FORMAT_CD_CODE, "MTP_FORMAT_CD" }, 120 { MTP_FORMAT_PICT_CODE, "MTP_FORMAT_PICT" }, 121 { MTP_FORMAT_PNG_CODE, "MTP_FORMAT_PNG" }, 122 { MTP_FORMAT_TIFF_CODE, "MTP_FORMAT_TIFF" }, 123 { MTP_FORMAT_TIFF_IT_CODE, "MTP_FORMAT_TIFF_IT" }, 124 { MTP_FORMAT_JP2_CODE, "MTP_FORMAT_JP2" }, 125 { MTP_FORMAT_JPX_CODE, "MTP_FORMAT_JPX" }, 126 { MTP_FORMAT_UNDEFINED_FIRMWARE_CODE, "MTP_FORMAT_UNDEFINED_FIRMWARE" }, 127 { MTP_FORMAT_WINDOWS_IMAGE_FORMAT_CODE, "MTP_FORMAT_WINDOWS_IMAGE_FORMAT" }, 128 { MTP_FORMAT_UNDEFINED_AUDIO_CODE, "MTP_FORMAT_UNDEFINED_AUDIO" }, 129 { MTP_FORMAT_WMA_CODE, "MTP_FORMAT_WMA" }, 130 { MTP_FORMAT_OGG_CODE, "MTP_FORMAT_OGG" }, 131 { MTP_FORMAT_AAC_CODE, "MTP_FORMAT_AAC" }, 132 { MTP_FORMAT_AUDIBLE_CODE, "MTP_FORMAT_AUDIBLE" }, 133 { MTP_FORMAT_FLAC_CODE, "MTP_FORMAT_FLAC" }, 134 { MTP_FORMAT_UNDEFINED_VIDEO_CODE, "MTP_FORMAT_UNDEFINED_VIDEO" }, 135 { MTP_FORMAT_WMV_CODE, "MTP_FORMAT_WMV" }, 136 { MTP_FORMAT_MP4_CONTAINER_CODE, "MTP_FORMAT_MP4_CONTAINER" }, 137 { MTP_FORMAT_MP2_CODE, "MTP_FORMAT_MP2" }, 138 { MTP_FORMAT_3GP_CONTAINER_CODE, "MTP_FORMAT_3GP_CONTAINER" }, 139 { MTP_FORMAT_UNDEFINED_COLLECTION_CODE, "MTP_FORMAT_UNDEFINED_COLLECTION" }, 140 { MTP_FORMAT_ABSTRACT_MULTIMEDIA_ALBUM_CODE, "MTP_FORMAT_ABSTRACT_MULTIMEDIA_ALBUM" }, 141 { MTP_FORMAT_ABSTRACT_IMAGE_ALBUM_CODE, "MTP_FORMAT_ABSTRACT_IMAGE_ALBUM" }, 142 { MTP_FORMAT_ABSTRACT_AUDIO_ALBUM_CODE, "MTP_FORMAT_ABSTRACT_AUDIO_ALBUM" }, 143 { MTP_FORMAT_ABSTRACT_VIDEO_ALBUM_CODE, "MTP_FORMAT_ABSTRACT_VIDEO_ALBUM" }, 144 { MTP_FORMAT_ABSTRACT_AUDIO_VIDEO_PLAYLIST_CODE, "MTP_FORMAT_ABSTRACT_AUDIO_VIDEO_PLAYLIST" }, 145 { MTP_FORMAT_ABSTRACT_CONTACT_GROUP_CODE, "MTP_FORMAT_ABSTRACT_CONTACT_GROUP" }, 146 { MTP_FORMAT_ABSTRACT_MESSAGE_FOLDER_CODE, "MTP_FORMAT_ABSTRACT_MESSAGE_FOLDER" }, 147 { MTP_FORMAT_ABSTRACT_CHAPTERED_PRODUCTION_CODE, "MTP_FORMAT_ABSTRACT_CHAPTERED_PRODUCTION" }, 148 { MTP_FORMAT_ABSTRACT_AUDIO_PLAYLIST_CODE, "MTP_FORMAT_ABSTRACT_AUDIO_PLAYLIST" }, 149 { MTP_FORMAT_ABSTRACT_VIDEO_PLAYLIST_CODE, "MTP_FORMAT_ABSTRACT_VIDEO_PLAYLIST" }, 150 { MTP_FORMAT_ABSTRACT_MEDIACAST_CODE, "MTP_FORMAT_ABSTRACT_MEDIACAST" }, 151 { MTP_FORMAT_WPL_PLAYLIST_CODE, "MTP_FORMAT_WPL_PLAYLIST" }, 152 { MTP_FORMAT_M3U_PLAYLIST_CODE, "MTP_FORMAT_M3U_PLAYLIST" }, 153 { MTP_FORMAT_MPL_PLAYLIST_CODE, "MTP_FORMAT_MPL_PLAYLIST" }, 154 { MTP_FORMAT_ASX_PLAYLIST_CODE, "MTP_FORMAT_ASX_PLAYLIST" }, 155 { MTP_FORMAT_PLS_PLAYLIST_CODE, "MTP_FORMAT_PLS_PLAYLIST" }, 156 { MTP_FORMAT_UNDEFINED_DOCUMENT_CODE, "MTP_FORMAT_UNDEFINED_DOCUMENT" }, 157 { MTP_FORMAT_ABSTRACT_DOCUMENT_CODE, "MTP_FORMAT_ABSTRACT_DOCUMENT" }, 158 { MTP_FORMAT_XML_DOCUMENT_CODE, "MTP_FORMAT_XML_DOCUMENT" }, 159 { MTP_FORMAT_MICROSOFT_WORD_DOCUMENT_CODE, "MTP_FORMAT_MICROSOFT_WORD_DOCUMENT" }, 160 { MTP_FORMAT_MHT_COMPILED_HTML_DOCUMENT_CODE, "MTP_FORMAT_MHT_COMPILED_HTML_DOCUMENT" }, 161 { MTP_FORMAT_MICROSOFT_EXCEL_SPREADSHEET_CODE, "MTP_FORMAT_MICROSOFT_EXCEL_SPREADSHEET" }, 162 { MTP_FORMAT_MICROSOFT_POWERPOINT_PRESENTATION_CODE, "MTP_FORMAT_MICROSOFT_POWERPOINT_PRESENTATION" }, 163 { MTP_FORMAT_UNDEFINED_MESSAGE_CODE, "MTP_FORMAT_UNDEFINED_MESSAGE" }, 164 { MTP_FORMAT_ABSTRACT_MESSAGE_CODE, "MTP_FORMAT_ABSTRACT_MESSAGE" }, 165 { MTP_FORMAT_UNDEFINED_CONTACT_CODE, "MTP_FORMAT_UNDEFINED_CONTACT" }, 166 { MTP_FORMAT_ABSTRACT_CONTACT_CODE, "MTP_FORMAT_ABSTRACT_CONTACT" }, 167 { MTP_FORMAT_VCARD_2_CODE, "MTP_FORMAT_VCARD_2" }, 168 }; 169 170 static const std::map<uint32_t, std::string> ObjectPropMap = { 171 { MTP_PROPERTY_STORAGE_ID_CODE, "MTP_PROPERTY_STORAGE_ID" }, 172 { MTP_PROPERTY_OBJECT_FORMAT_CODE, "MTP_PROPERTY_OBJECT_FORMAT" }, 173 { MTP_PROPERTY_PROTECTION_STATUS_CODE, "MTP_PROPERTY_PROTECTION_STATUS" }, 174 { MTP_PROPERTY_OBJECT_SIZE_CODE, "MTP_PROPERTY_OBJECT_SIZE" }, 175 { MTP_PROPERTY_ASSOCIATION_TYPE_CODE, "MTP_PROPERTY_ASSOCIATION_TYPE" }, 176 { MTP_PROPERTY_ASSOCIATION_DESC_CODE, "MTP_PROPERTY_ASSOCIATION_DESC" }, 177 { MTP_PROPERTY_OBJECT_FILE_NAME_CODE, "MTP_PROPERTY_OBJECT_FILE_NAME" }, 178 { MTP_PROPERTY_DATE_CREATED_CODE, "MTP_PROPERTY_DATE_CREATED" }, 179 { MTP_PROPERTY_DATE_MODIFIED_CODE, "MTP_PROPERTY_DATE_MODIFIED" }, 180 { MTP_PROPERTY_KEYWORDS_CODE, "MTP_PROPERTY_KEYWORDS" }, 181 { MTP_PROPERTY_PARENT_OBJECT_CODE, "MTP_PROPERTY_PARENT_OBJECT" }, 182 { MTP_PROPERTY_ALLOWED_FOLDER_CONTENTS_CODE, "MTP_PROPERTY_ALLOWED_FOLDER_CONTENTS" }, 183 { MTP_PROPERTY_HIDDEN_CODE, "MTP_PROPERTY_HIDDEN" }, 184 { MTP_PROPERTY_SYSTEM_OBJECT_CODE, "MTP_PROPERTY_SYSTEM_OBJECT" }, 185 { MTP_PROPERTY_PERSISTENT_UID_CODE, "MTP_PROPERTY_PERSISTENT_UID" }, 186 { MTP_PROPERTY_SYNCID_CODE, "MTP_PROPERTY_SYNCID" }, 187 { MTP_PROPERTY_PROPERTY_BAG_CODE, "MTP_PROPERTY_PROPERTY_BAG" }, 188 { MTP_PROPERTY_NAME_CODE, "MTP_PROPERTY_NAME" }, 189 { MTP_PROPERTY_CREATED_BY_CODE, "MTP_PROPERTY_CREATED_BY" }, 190 { MTP_PROPERTY_ARTIST_CODE, "MTP_PROPERTY_ARTIST" }, 191 { MTP_PROPERTY_DATE_AUTHORED_CODE, "MTP_PROPERTY_DATE_AUTHORED" }, 192 { MTP_PROPERTY_DESCRIPTION_CODE, "MTP_PROPERTY_DESCRIPTION" }, 193 { MTP_PROPERTY_URL_REFERENCE_CODE, "MTP_PROPERTY_URL_REFERENCE" }, 194 { MTP_PROPERTY_LANGUAG_LOCALE_CODE, "MTP_PROPERTY_LANGUAG_LOCALE" }, 195 { MTP_PROPERTY_COPYRIGHT_INFORMATION_CODE, "MTP_PROPERTY_COPYRIGHT_INFORMATION" }, 196 { MTP_PROPERTY_SOURCE_CODE, "MTP_PROPERTY_SOURCE" }, 197 { MTP_PROPERTY_ORIGIN_LOCATION_CODE, "MTP_PROPERTY_ORIGIN_LOCATION" }, 198 { MTP_PROPERTY_DATE_ADDED_CODE, "MTP_PROPERTY_DATE_ADDED" }, 199 { MTP_PROPERTY_NO_CONSUMABLE_CODE, "MTP_PROPERTY_NO_CONSUMABLE" }, 200 { MTP_PROPERTY_CORRUP_UNPLAYABLE_CODE, "MTP_PROPERTY_CORRUP_UNPLAYABLE" }, 201 { MTP_PROPERTY_PRODUCERSERIALNUMBER_CODE, "MTP_PROPERTY_PRODUCERSERIALNUMBER" }, 202 { MTP_PROPERTY_REPRESENTATIVE_SAMPLE_FORMAT_CODE, "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_FORMAT" }, 203 { MTP_PROPERTY_REPRESENTATIVE_SAMPLE_SIZE_CODE, "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_SIZE" }, 204 { MTP_PROPERTY_REPRESENTATIVE_SAMPLE_HEIGHT_CODE, "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_HEIGHT" }, 205 { MTP_PROPERTY_REPRESENTATIVE_SAMPLE_WIDTH_CODE, "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_WIDTH" }, 206 { MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DURATION_CODE, "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DURATION" }, 207 { MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DATA_CODE, "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DATA" }, 208 { MTP_PROPERTY_WIDTH_CODE, "MTP_PROPERTY_WIDTH" }, 209 { MTP_PROPERTY_HEIGHT_CODE, "MTP_PROPERTY_HEIGHT" }, 210 { MTP_PROPERTY_DURATION_CODE, "MTP_PROPERTY_DURATION" }, 211 { MTP_PROPERTY_RATING_CODE, "MTP_PROPERTY_RATING" }, 212 { MTP_PROPERTY_TRACK_CODE, "MTP_PROPERTY_TRACK" }, 213 { MTP_PROPERTY_GENRE_CODE, "MTP_PROPERTY_GENRE" }, 214 { MTP_PROPERTY_CREDITS_CODE, "MTP_PROPERTY_CREDITS" }, 215 { MTP_PROPERTY_LYRICS_CODE, "MTP_PROPERTY_LYRICS" }, 216 { MTP_PROPERTY_SUBSCRIPTION_CONTENT_ID_CODE, "MTP_PROPERTY_SUBSCRIPTION_CONTENT_ID" }, 217 { MTP_PROPERTY_PRODUCED_BY_CODE, "MTP_PROPERTY_PRODUCED_BY" }, 218 { MTP_PROPERTY_USE_COUNT_CODE, "MTP_PROPERTY_USE_COUNT" }, 219 { MTP_PROPERTY_SKIP_COUNT_CODE, "MTP_PROPERTY_SKIP_COUNT" }, 220 { MTP_PROPERTY_LAST_ACCESSED_CODE, "MTP_PROPERTY_LAST_ACCESSED" }, 221 { MTP_PROPERTY_PARENTAL_RATING_CODE, "MTP_PROPERTY_PARENTAL_RATING" }, 222 { MTP_PROPERTY_META_GENRE_CODE, "MTP_PROPERTY_META_GENRE" }, 223 { MTP_PROPERTY_COMPOSER_CODE, "MTP_PROPERTY_COMPOSER" }, 224 { MTP_PROPERTY_EFFECTIVE_RATING_CODE, "MTP_PROPERTY_EFFECTIVE_RATING" }, 225 { MTP_PROPERTY_SUBTITLE_CODE, "MTP_PROPERTY_SUBTITLE" }, 226 { MTP_PROPERTY_ORIGINAL_RELEASE_DATE_CODE, "MTP_PROPERTY_ORIGINAL_RELEASE_DATE" }, 227 { MTP_PROPERTY_ALBUM_NAME_CODE, "MTP_PROPERTY_ALBUM_NAME" }, 228 { MTP_PROPERTY_ALBUM_ARTIST_CODE, "MTP_PROPERTY_ALBUM_ARTIST" }, 229 { MTP_PROPERTY_MOOD_CODE, "MTP_PROPERTY_MOOD" }, 230 { MTP_PROPERTY_DRM_STATUS_CODE, "MTP_PROPERTY_DRM_STATUS" }, 231 { MTP_PROPERTY_SUB_DESCRIPTION_CODE, "MTP_PROPERTY_SUB_DESCRIPTION" }, 232 { MTP_PROPERTY_IS_CROPPED_CODE, "MTP_PROPERTY_IS_CROPPED" }, 233 { MTP_PROPERTY_IS_COLOUR_CORRECTED_CODE, "MTP_PROPERTY_IS_COLOUR_CORRECTED" }, 234 { MTP_PROPERTY_IMAGE_BIT_DEPTH_CODE, "MTP_PROPERTY_IMAGE_BIT_DEPTH" }, 235 { MTP_PROPERTY_FNUMBER_CODE, "MTP_PROPERTY_FNUMBER" }, 236 { MTP_PROPERTY_EXPOSURE_TIME_CODE, "MTP_PROPERTY_EXPOSURE_TIME" }, 237 { MTP_PROPERTY_EXPOSURE_INDEX_CODE, "MTP_PROPERTY_EXPOSURE_INDEX" }, 238 { MTP_PROPERTY_TOTAL_BITRATE_CODE, "MTP_PROPERTY_TOTAL_BITRATE" }, 239 { MTP_PROPERTY_BITRATE_TYPE_CODE, "MTP_PROPERTY_BITRATE_TYPE" }, 240 { MTP_PROPERTY_SAMPLE_RATE_CODE, "MTP_PROPERTY_SAMPLE_RATE" }, 241 { MTP_PROPERTY_NUMBER_OF_CHANNELS_CODE, "MTP_PROPERTY_NUMBER_OF_CHANNELS" }, 242 { MTP_PROPERTY_AUDIO_BITDEPTH_CODE, "MTP_PROPERTY_AUDIO_BITDEPTH" }, 243 { MTP_PROPERTY_SCAN_TYPE_CODE, "MTP_PROPERTY_SCAN_TYPE" }, 244 { MTP_PROPERTY_AUDIO_WAVE_CODEC_CODE, "MTP_PROPERTY_AUDIO_WAVE_CODEC" }, 245 { MTP_PROPERTY_AUDIO_BITRATE_CODE, "MTP_PROPERTY_AUDIO_BITRATE" }, 246 { MTP_PROPERTY_VIDEO_FOURCC_CODEC_CODE, "MTP_PROPERTY_VIDEO_FOURCC_CODEC" }, 247 { MTP_PROPERTY_VIDEO_BITRATE_CODE, "MTP_PROPERTY_VIDEO_BITRATE" }, 248 { MTP_PROPERTY_FRAMES_PER_THOUSAND_SECONDS_CODE, "MTP_PROPERTY_FRAMES_PER_THOUSAND_SECONDS" }, 249 { MTP_PROPERTY_KEYFRAME_DISTANCE_CODE, "MTP_PROPERTY_KEYFRAME_DISTANCE" }, 250 { MTP_PROPERTY_BUFFER_SIZE_CODE, "MTP_PROPERTY_BUFFER_SIZE" }, 251 { MTP_PROPERTY_ENCODING_QUALITY_CODE, "MTP_PROPERTY_ENCODING_QUALITY" }, 252 { MTP_PROPERTY_ENCODING_PROFILE_CODE, "MTP_PROPERTY_ENCODING_PROFILE" }, 253 { MTP_PROPERTY_DISPLAY_NAME_CODE, "MTP_PROPERTY_DISPLAY_NAME" }, 254 { MTP_PROPERTY_BODY_TEXT_CODE, "MTP_PROPERTY_BODY_TEXT" }, 255 { MTP_PROPERTY_SUBJECT_CODE, "MTP_PROPERTY_SUBJECT" }, 256 { MTP_PROPERTY_PRIORITY_CODE, "MTP_PROPERTY_PRIORITY" }, 257 { MTP_PROPERTY_GIVEN_NAME_CODE, "MTP_PROPERTY_GIVEN_NAME" }, 258 { MTP_PROPERTY_MIDDLE_NAMES_CODE, "MTP_PROPERTY_MIDDLE_NAMES" }, 259 { MTP_PROPERTY_FAMILY_NAME_CODE, "MTP_PROPERTY_FAMILY_NAME" }, 260 { MTP_PROPERTY_PREFIX_CODE, "MTP_PROPERTY_PREFIX" }, 261 { MTP_PROPERTY_SUFFIX_CODE, "MTP_PROPERTY_SUFFIX" }, 262 { MTP_PROPERTY_PHONETIC_GIVEN_NAME_CODE, "MTP_PROPERTY_PHONETIC_GIVEN_NAME" }, 263 { MTP_PROPERTY_PHONETIC_FAMILY_NAME_CODE, "MTP_PROPERTY_PHONETIC_FAMILY_NAME" }, 264 { MTP_PROPERTY_EMAIL_PRIMARY_CODE, "MTP_PROPERTY_EMAIL_PRIMARY" }, 265 { MTP_PROPERTY_EMAIL_PERSONAL_1_CODE, "MTP_PROPERTY_EMAIL_PERSONAL_1" }, 266 { MTP_PROPERTY_EMAIL_PERSONAL_2_CODE, "MTP_PROPERTY_EMAIL_PERSONAL_2" }, 267 { MTP_PROPERTY_EMAIL_BUSINESS_1_CODE, "MTP_PROPERTY_EMAIL_BUSINESS_1" }, 268 { MTP_PROPERTY_EMAIL_BUSINESS_2_CODE, "MTP_PROPERTY_EMAIL_BUSINESS_2" }, 269 { MTP_PROPERTY_EMAIL_OTHERS_CODE, "MTP_PROPERTY_EMAIL_OTHERS" }, 270 { MTP_PROPERTY_PHONE_NUMBER_PRIMARY_CODE, "MTP_PROPERTY_PHONE_NUMBER_PRIMARY" }, 271 { MTP_PROPERTY_PHONE_NUMBER_PERSONAL_CODE, "MTP_PROPERTY_PHONE_NUMBER_PERSONAL" }, 272 { MTP_PROPERTY_PHONE_NUMBER_PERSONAL_2_CODE, "MTP_PROPERTY_PHONE_NUMBER_PERSONAL_2" }, 273 { MTP_PROPERTY_PHONE_NUMBER_BUSINESS_CODE, "MTP_PROPERTY_PHONE_NUMBER_BUSINESS" }, 274 { MTP_PROPERTY_PHONE_NUMBER_BUSINESS_2_CODE, "MTP_PROPERTY_PHONE_NUMBER_BUSINESS_2" }, 275 { MTP_PROPERTY_PHONE_NUMBER_MOBILE_CODE, "MTP_PROPERTY_PHONE_NUMBER_MOBILE" }, 276 { MTP_PROPERTY_PHONE_NUMBER_MOBILE_2_CODE, "MTP_PROPERTY_PHONE_NUMBER_MOBILE_2" }, 277 { MTP_PROPERTY_FAX_NUMBER_PRIMARY_CODE, "MTP_PROPERTY_FAX_NUMBER_PRIMARY" }, 278 { MTP_PROPERTY_FAX_NUMBER_PERSONAL_CODE, "MTP_PROPERTY_FAX_NUMBER_PERSONAL" }, 279 { MTP_PROPERTY_FAX_NUMBER_BUSINESS_CODE, "MTP_PROPERTY_FAX_NUMBER_BUSINESS" }, 280 { MTP_PROPERTY_PAGER_NUMBER_CODE, "MTP_PROPERTY_PAGER_NUMBER" }, 281 { MTP_PROPERTY_PHONE_NUMBER_OTHERS_CODE, "MTP_PROPERTY_PHONE_NUMBER_OTHERS" }, 282 { MTP_PROPERTY_PRIMARY_WEB_ADDRESS_CODE, "MTP_PROPERTY_PRIMARY_WEB_ADDRESS" }, 283 { MTP_PROPERTY_PERSONAL_WEB_ADDRESS_CODE, "MTP_PROPERTY_PERSONAL_WEB_ADDRESS" }, 284 { MTP_PROPERTY_BUSINESS_WEB_ADDRESS_CODE, "MTP_PROPERTY_BUSINESS_WEB_ADDRESS" }, 285 { MTP_PROPERTY_INSTANT_MESSENGER_ADDRESS_CODE, "MTP_PROPERTY_INSTANT_MESSENGER_ADDRESS" }, 286 { MTP_PROPERTY_INSTANT_MESSENGER_ADDRESS_2_CODE, "MTP_PROPERTY_INSTANT_MESSENGER_ADDRESS_2" }, 287 { MTP_PROPERTY_INSTANT_MESSENGER_ADDRESS_3_CODE, "MTP_PROPERTY_INSTANT_MESSENGER_ADDRESS_3" }, 288 { MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_FULL_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_FULL" }, 289 { MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_1_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_1" }, 290 { MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_2_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_2" }, 291 { MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_CITY_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_CITY" }, 292 { MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_REGION_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_REGION" }, 293 { MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_POSTAL_CODE_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_POSTAL" }, 294 { MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_COUNTRY_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_COUNTRY" }, 295 { MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_FULL_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_FULL" }, 296 { MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_1_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_1" }, 297 { MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_2_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_2" }, 298 { MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_CITY_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_CITY" }, 299 { MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_REGION_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_REGION" }, 300 { MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_POSTAL_CODE_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_POSTAL" }, 301 { MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_COUNTRY_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_COUNTRY" }, 302 { MTP_PROPERTY_POSTAL_ADDRESS_OTHER_FULL_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_FULL" }, 303 { MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_1_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_1" }, 304 { MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_2_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_2" }, 305 { MTP_PROPERTY_POSTAL_ADDRESS_OTHER_CITY_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_CITY" }, 306 { MTP_PROPERTY_POSTAL_ADDRESS_OTHER_REGION_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_REGION" }, 307 { MTP_PROPERTY_POSTAL_ADDRESS_OTHER_POSTAL_CODE_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_POSTAL" }, 308 { MTP_PROPERTY_POSTAL_ADDRESS_OTHER_COUNTRY_CODE, "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_COUNTRY" }, 309 { MTP_PROPERTY_ORGANIZATION_NAME_CODE, "MTP_PROPERTY_ORGANIZATION_NAME" }, 310 { MTP_PROPERTY_PHONETIC_ORGANIZATION_NAME_CODE, "MTP_PROPERTY_PHONETIC_ORGANIZATION_NAME" }, 311 { MTP_PROPERTY_ROLE_CODE, "MTP_PROPERTY_ROLE" }, 312 { MTP_PROPERTY_BIRTHDATE_CODE, "MTP_PROPERTY_BIRTHDATE" }, 313 { MTP_PROPERTY_MESSAGE_TO_CODE, "MTP_PROPERTY_MESSAGE_TO" }, 314 { MTP_PROPERTY_MESSAGE_CC_CODE, "MTP_PROPERTY_MESSAGE_CC" }, 315 { MTP_PROPERTY_MESSAGE_BCC_CODE, "MTP_PROPERTY_MESSAGE_BCC" }, 316 { MTP_PROPERTY_MESSAGE_READ_CODE, "MTP_PROPERTY_MESSAGE_READ" }, 317 { MTP_PROPERTY_MESSAGE_RECEIVED_TIME_CODE, "MTP_PROPERTY_MESSAGE_RECEIVED_TIME" }, 318 { MTP_PROPERTY_MESSAGE_SENDER_CODE, "MTP_PROPERTY_MESSAGE_SENDER" }, 319 { MTP_PROPERTY_ACTIVITY_BEGIN_TIME_CODE, "MTP_PROPERTY_ACTIVITY_BEGIN_TIME" }, 320 { MTP_PROPERTY_ACTIVITY_END_TIME_CODE, "MTP_PROPERTY_ACTIVITY_END_TIME" }, 321 { MTP_PROPERTY_ACTIVITY_LOCATION_CODE, "MTP_PROPERTY_ACTIVITY_LOCATION" }, 322 { MTP_PROPERTY_ACTIVITY_REQUIRED_ATTENDEES_CODE, "MTP_PROPERTY_ACTIVITY_REQUIRED_ATTENDEES" }, 323 { MTP_PROPERTY_ACTIVITY_OPTIONAL_ATTENDEES_CODE, "MTP_PROPERTY_ACTIVITY_OPTIONAL_ATTENDEES" }, 324 { MTP_PROPERTY_ACTIVITY_RESOURCES_CODE, "MTP_PROPERTY_ACTIVITY_RESOURCES" }, 325 { MTP_PROPERTY_ACTIVITY_ACCEPTED_CODE, "MTP_PROPERTY_ACTIVITY_ACCEPTED" }, 326 { MTP_PROPERTY_ACTIVITY_TENTATIVE_CODE, "MTP_PROPERTY_ACTIVITY_TENTATIVE" }, 327 { MTP_PROPERTY_ACTIVITY_DECLINED_CODE, "MTP_PROPERTY_ACTIVITY_DECLINED" }, 328 { MTP_PROPERTY_ACTIVITY_REMINDER_TIME_CODE, "MTP_PROPERTY_ACTIVITY_REMINDER_TIME" }, 329 { MTP_PROPERTY_ACTIVITY_OWNER_CODE, "MTP_PROPERTY_ACTIVITY_OWNER" }, 330 { MTP_PROPERTY_ACTIVITY_STATUS_CODE, "MTP_PROPERTY_ACTIVITY_STATUS" }, 331 { MTP_PROPERTY_OWNER_CODE, "MTP_PROPERTY_OWNER" }, 332 { MTP_PROPERTY_EDITOR_CODE, "MTP_PROPERTY_EDITOR" }, 333 { MTP_PROPERTY_WEBMASTER_CODE, "MTP_PROPERTY_WEBMASTER" }, 334 { MTP_PROPERTY_URL_SOURCE_CODE, "MTP_PROPERTY_URL_SOURCE" }, 335 { MTP_PROPERTY_URL_DESTINATION_CODE, "MTP_PROPERTY_URL_DESTINATION" }, 336 { MTP_PROPERTY_TIME_BOOKMARK_CODE, "MTP_PROPERTY_TIME_BOOKMARK" }, 337 { MTP_PROPERTY_OBJECT_BOOKMARK_CODE, "MTP_PROPERTY_OBJECT_BOOKMARK" }, 338 { MTP_PROPERTY_BYTE_BOOKMARK_CODE, "MTP_PROPERTY_BYTE_BOOKMARK" }, 339 { MTP_PROPERTY_LAST_BUILD_DATE_CODE, "MTP_PROPERTY_LAST_BUILD_DATE" }, 340 { MTP_PROPERTY_TIME_TO_LIVE_CODE, "MTP_PROPERTY_TIME_TO_LIVE" }, 341 { MTP_PROPERTY_MEDIA_GUID_CODE, "MTP_PROPERTY_MEDIA_GUID" }, 342 }; 343 344 static const std::map<int, std::string> DataTypeMap = { 345 { MTP_TYPE_UNDEFINED_CODE, "MTP_TYPE_UNDEFINED" }, 346 { MTP_TYPE_INT8_CODE, "MTP_TYPE_INT8" }, 347 { MTP_TYPE_UINT8_CODE, "MTP_TYPE_UINT8" }, 348 { MTP_TYPE_INT16_CODE, "MTP_TYPE_INT16" }, 349 { MTP_TYPE_UINT16_CODE, "MTP_TYPE_UINT16" }, 350 { MTP_TYPE_INT32_CODE, "MTP_TYPE_INT32" }, 351 { MTP_TYPE_UINT32_CODE, "MTP_TYPE_UINT32" }, 352 { MTP_TYPE_INT64_CODE, "MTP_TYPE_INT64" }, 353 { MTP_TYPE_UINT64_CODE, "MTP_TYPE_UINT64" }, 354 { MTP_TYPE_INT128_CODE, "MTP_TYPE_INT128" }, 355 { MTP_TYPE_UINT128_CODE, "MTP_TYPE_UINT128" }, 356 { MTP_TYPE_AINT8_CODE, "MTP_TYPE_AINT8" }, 357 { MTP_TYPE_AUINT8_CODE, "MTP_TYPE_AUINT8" }, 358 { MTP_TYPE_AINT16_CODE, "MTP_TYPE_AINT16" }, 359 { MTP_TYPE_AUINT16_CODE, "MTP_TYPE_AUINT16" }, 360 { MTP_TYPE_AINT32_CODE, "MTP_TYPE_AINT32" }, 361 { MTP_TYPE_AUINT32_CODE, "MTP_TYPE_AUINT32" }, 362 { MTP_TYPE_AINT64_CODE, "MTP_TYPE_AINT64" }, 363 { MTP_TYPE_AUINT64_CODE, "MTP_TYPE_AUINT64" }, 364 { MTP_TYPE_AINT128_CODE, "MTP_TYPE_AINT128" }, 365 { MTP_TYPE_AUINT128_CODE, "MTP_TYPE_AUINT128" }, 366 { MTP_TYPE_STRING_CODE, "MTP_TYPE_STRING" }, 367 }; 368 369 static const std::map<uint32_t, std::string> EventMap = { 370 { MTP_EVENT_UNDEFINED_CODE, "MTP_EVENT_UNDEFINED" }, 371 { MTP_EVENT_CANCEL_TRANSACTION_CODE, "MTP_EVENT_CANCEL_TRANSACTION" }, 372 { MTP_EVENT_OBJECT_ADDED_CODE, "MTP_EVENT_OBJECT_ADDED" }, 373 { MTP_EVENT_OBJECT_REMOVED_CODE, "MTP_EVENT_OBJECT_REMOVED" }, 374 { MTP_EVENT_STORE_ADDED_CODE, "MTP_EVENT_STORE_ADDED" }, 375 { MTP_EVENT_STORE_REMOVED_CODE, "MTP_EVENT_STORE_REMOVED" }, 376 { MTP_EVENT_DEVICE_PROP_CHANGED_CODE, "MTP_EVENT_DEVICE_PROP_CHANGED" }, 377 { MTP_EVENT_OBJECT_INFO_CHANGED_CODE, "MTP_EVENT_OBJECT_INFO_CHANGED" }, 378 { MTP_EVENT_DEVICE_INFO_CHANGED_CODE, "MTP_EVENT_DEVICE_INFO_CHANGED" }, 379 { MTP_EVENT_REQUEST_OBJECT_TRANSFER_CODE, "MTP_EVENT_REQUEST_OBJECT_TRANSFER" }, 380 { MTP_EVENT_STORE_FULL_CODE, "MTP_EVENT_STORE_FULL" }, 381 { MTP_EVENT_DEVICE_RESET_CODE, "MTP_EVENT_DEVICE_RESET" }, 382 { MTP_EVENT_STORAGE_INFO_CHANGED_CODE, "MTP_EVENT_STORAGE_INFO_CHANGED" }, 383 { MTP_EVENT_CAPTURE_COMPLETE_CODE, "MTP_EVENT_CAPTURE_COMPLETE" }, 384 { MTP_EVENT_UNREPORTED_STATUS_CODE, "MTP_EVENT_UNREPORTED_STATUS" }, 385 { MTP_EVENT_OBJECT_PROP_CHANGED_CODE, "MTP_EVENT_OBJECT_PROP_CHANGED" }, 386 { MTP_EVENT_OBJECT_PROP_DESC_CHANGED_CODE, "MTP_EVENT_OBJECT_PROP_DESC_CHANGED" }, 387 { MTP_EVENT_OBJECT_REFERENCES_CHANGED_CODE, "MTP_EVENT_OBJECT_REFERENCES_CHANGED" }, 388 }; 389 390 static const std::map<uint16_t, int> ObjectPropTypeMap = { 391 { MTP_PROPERTY_STORAGE_ID_CODE, MTP_TYPE_UINT32_CODE }, 392 { MTP_PROPERTY_OBJECT_FORMAT_CODE, MTP_TYPE_UINT16_CODE }, 393 { MTP_PROPERTY_PROTECTION_STATUS_CODE, MTP_TYPE_UINT16_CODE }, 394 { MTP_PROPERTY_OBJECT_SIZE_CODE, MTP_TYPE_UINT64_CODE }, 395 { MTP_PROPERTY_OBJECT_FILE_NAME_CODE, MTP_TYPE_STRING_CODE }, 396 { MTP_PROPERTY_DATE_MODIFIED_CODE, MTP_TYPE_STRING_CODE }, 397 { MTP_PROPERTY_PARENT_OBJECT_CODE, MTP_TYPE_UINT32_CODE }, 398 { MTP_PROPERTY_PERSISTENT_UID_CODE, MTP_TYPE_UINT128_CODE }, 399 { MTP_PROPERTY_NAME_CODE, MTP_TYPE_STRING_CODE }, 400 { MTP_PROPERTY_DISPLAY_NAME_CODE, MTP_TYPE_STRING_CODE }, 401 { MTP_PROPERTY_DATE_ADDED_CODE, MTP_TYPE_STRING_CODE }, 402 { MTP_PROPERTY_ARTIST_CODE, MTP_TYPE_STRING_CODE }, 403 { MTP_PROPERTY_ALBUM_NAME_CODE, MTP_TYPE_STRING_CODE }, 404 { MTP_PROPERTY_ALBUM_ARTIST_CODE, MTP_TYPE_STRING_CODE }, 405 { MTP_PROPERTY_TRACK_CODE, MTP_TYPE_UINT16_CODE }, 406 { MTP_PROPERTY_ORIGINAL_RELEASE_DATE_CODE, MTP_TYPE_STRING_CODE }, 407 { MTP_PROPERTY_GENRE_CODE, MTP_TYPE_STRING_CODE }, 408 { MTP_PROPERTY_COMPOSER_CODE, MTP_TYPE_STRING_CODE }, 409 { MTP_PROPERTY_DURATION_CODE, MTP_TYPE_UINT32_CODE }, 410 { MTP_PROPERTY_DESCRIPTION_CODE, MTP_TYPE_STRING_CODE }, 411 { MTP_PROPERTY_AUDIO_WAVE_CODEC_CODE, MTP_TYPE_UINT32_CODE }, 412 { MTP_PROPERTY_BITRATE_TYPE_CODE, MTP_TYPE_UINT16_CODE }, 413 { MTP_PROPERTY_AUDIO_BITRATE_CODE, MTP_TYPE_UINT32_CODE }, 414 { MTP_PROPERTY_NUMBER_OF_CHANNELS_CODE, MTP_TYPE_UINT16_CODE }, 415 { MTP_PROPERTY_SAMPLE_RATE_CODE, MTP_TYPE_UINT32_CODE }, 416 }; 417 } 418 MtpPacketTool()419 MtpPacketTool::MtpPacketTool() 420 { 421 } 422 ~MtpPacketTool()423 MtpPacketTool::~MtpPacketTool() 424 { 425 } 426 GetUInt16(uint8_t numFirst,uint8_t numSecond)427 uint16_t MtpPacketTool::GetUInt16(uint8_t numFirst, uint8_t numSecond) 428 { 429 return ((uint16_t)numSecond << BIT_8) | (uint16_t)numFirst; 430 } 431 GetUInt32(uint8_t numFirst,uint8_t numSecond,uint8_t numThird,uint8_t numFourth)432 uint32_t MtpPacketTool::GetUInt32(uint8_t numFirst, uint8_t numSecond, uint8_t numThird, uint8_t numFourth) 433 { 434 return ((uint32_t)numFourth << BIT_24) | ((uint32_t)numThird << BIT_16) | ((uint32_t)numSecond << BIT_8) | 435 (uint32_t)numFirst; 436 } 437 PutUInt8(std::vector<uint8_t> & outBuffer,uint16_t value)438 void MtpPacketTool::PutUInt8(std::vector<uint8_t> &outBuffer, uint16_t value) 439 { 440 outBuffer.push_back((uint8_t)(value & 0xFF)); 441 } 442 PutUInt16(std::vector<uint8_t> & outBuffer,uint16_t value)443 void MtpPacketTool::PutUInt16(std::vector<uint8_t> &outBuffer, uint16_t value) 444 { 445 outBuffer.push_back((uint8_t)(value & 0xFF)); 446 outBuffer.push_back((uint8_t)((value >> BIT_8) & 0xFF)); 447 } 448 PutUInt32(std::vector<uint8_t> & outBuffer,uint32_t value)449 void MtpPacketTool::PutUInt32(std::vector<uint8_t> &outBuffer, uint32_t value) 450 { 451 outBuffer.push_back((uint8_t)(value & 0xFF)); 452 outBuffer.push_back((uint8_t)((value >> BIT_8) & 0xFF)); 453 outBuffer.push_back((uint8_t)((value >> BIT_16) & 0xFF)); 454 outBuffer.push_back((uint8_t)((value >> BIT_24) & 0xFF)); 455 } 456 PutUInt64(std::vector<uint8_t> & outBuffer,uint64_t value)457 void MtpPacketTool::PutUInt64(std::vector<uint8_t> &outBuffer, uint64_t value) 458 { 459 outBuffer.push_back((uint8_t)(value & 0xFF)); 460 outBuffer.push_back((uint8_t)((value >> BIT_8) & 0xFF)); 461 outBuffer.push_back((uint8_t)((value >> BIT_16) & 0xFF)); 462 outBuffer.push_back((uint8_t)((value >> BIT_24) & 0xFF)); 463 outBuffer.push_back((uint8_t)((value >> BIT_32) & 0xFF)); 464 outBuffer.push_back((uint8_t)((value >> BIT_40) & 0xFF)); 465 outBuffer.push_back((uint8_t)((value >> BIT_48) & 0xFF)); 466 outBuffer.push_back((uint8_t)((value >> BIT_56) & 0xFF)); 467 } 468 PutUInt128(std::vector<uint8_t> & outBuffer,uint64_t value)469 void MtpPacketTool::PutUInt128(std::vector<uint8_t> &outBuffer, uint64_t value) 470 { 471 PutUInt64(outBuffer, value); 472 PutUInt64(outBuffer, 0); 473 } 474 PutUInt128(std::vector<uint8_t> & outBuffer,const uint128_t value)475 void MtpPacketTool::PutUInt128(std::vector<uint8_t> &outBuffer, const uint128_t value) 476 { 477 PutUInt32(outBuffer, value[OFFSET_0]); 478 PutUInt32(outBuffer, value[OFFSET_1]); 479 PutUInt32(outBuffer, value[OFFSET_2]); 480 PutUInt32(outBuffer, value[OFFSET_3]); 481 } 482 PutAUInt16(std::vector<uint8_t> & outBuffer,const uint16_t * values,int count)483 void MtpPacketTool::PutAUInt16(std::vector<uint8_t> &outBuffer, const uint16_t *values, int count) 484 { 485 PutUInt32(outBuffer, count); 486 for (int i = 0; i < count; i++) { 487 PutUInt16(outBuffer, *values++); 488 } 489 } 490 PutAUInt32(std::vector<uint8_t> & outBuffer,const uint32_t * values,int count)491 void MtpPacketTool::PutAUInt32(std::vector<uint8_t> &outBuffer, const uint32_t *values, int count) 492 { 493 PutUInt32(outBuffer, count); 494 for (int i = 0; i < count; i++) { 495 PutUInt32(outBuffer, *values++); 496 } 497 } 498 PutInt8(std::vector<uint8_t> & outBuffer,int8_t value)499 void MtpPacketTool::PutInt8(std::vector<uint8_t> &outBuffer, int8_t value) 500 { 501 outBuffer.push_back(static_cast<uint8_t>(value)); 502 } 503 PutInt16(std::vector<uint8_t> & outBuffer,int16_t value)504 void MtpPacketTool::PutInt16(std::vector<uint8_t> &outBuffer, int16_t value) 505 { 506 PutUInt16(outBuffer, static_cast<uint16_t>(value)); 507 } 508 PutInt32(std::vector<uint8_t> & outBuffer,int32_t value)509 void MtpPacketTool::PutInt32(std::vector<uint8_t> &outBuffer, int32_t value) 510 { 511 PutUInt32(outBuffer, static_cast<uint32_t>(value)); 512 } 513 PutInt64(std::vector<uint8_t> & outBuffer,int64_t value)514 void MtpPacketTool::PutInt64(std::vector<uint8_t> &outBuffer, int64_t value) 515 { 516 PutUInt64(outBuffer, static_cast<uint64_t>(value)); 517 } 518 PutInt128(std::vector<uint8_t> & outBuffer,int64_t value)519 void MtpPacketTool::PutInt128(std::vector<uint8_t> &outBuffer, int64_t value) 520 { 521 PutUInt64(outBuffer, static_cast<uint64_t>(value)); 522 PutUInt64(outBuffer, static_cast<uint64_t>(value < 0 ? -1 : 0)); 523 } 524 PutInt128(std::vector<uint8_t> & outBuffer,const int128_t value)525 void MtpPacketTool::PutInt128(std::vector<uint8_t> &outBuffer, const int128_t value) 526 { 527 PutUInt32(outBuffer, static_cast<uint32_t>(value[OFFSET_0])); 528 PutUInt32(outBuffer, static_cast<uint32_t>(value[OFFSET_1])); 529 PutUInt32(outBuffer, static_cast<uint32_t>(value[OFFSET_2])); 530 PutUInt32(outBuffer, static_cast<uint32_t>(value[OFFSET_3])); 531 } 532 PutString(std::vector<uint8_t> & outBuffer,const std::string & string)533 void MtpPacketTool::PutString(std::vector<uint8_t> &outBuffer, const std::string &string) 534 { 535 std::u16string src16 = Utf8ToUtf16(string); 536 537 uint16_t count = src16.length(); 538 if (count == 0) { 539 PutUInt8(outBuffer, 0); 540 return; 541 } 542 PutUInt8(outBuffer, std::min(count + 1, MAX_LENGTH)); 543 544 int i = 0; 545 for (char16_t &c : src16) { 546 if (i == MAX_LENGTH - 1) { 547 break; 548 } 549 PutUInt16(outBuffer, c); 550 i++; 551 } 552 PutUInt16(outBuffer, 0); 553 } 554 555 std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> gConvert(UTF16_CERROR, UTF8_CERROR); 556 Utf8ToUtf16(const std::string & inputStr)557 std::u16string MtpPacketTool::Utf8ToUtf16(const std::string &inputStr) 558 { 559 std::u16string conversion = gConvert.from_bytes(inputStr); 560 if (conversion == UTF8_CERROR) { 561 return u""; 562 } else { 563 return conversion; 564 } 565 } 566 Utf16ToUtf8(const std::u16string & inputStr)567 std::string MtpPacketTool::Utf16ToUtf8(const std::u16string &inputStr) 568 { 569 std::string conversion = gConvert.to_bytes(inputStr); 570 if (conversion == UTF16_CERROR) { 571 return ""; 572 } else { 573 return conversion; 574 } 575 } 576 GetUInt8(const std::vector<uint8_t> & buffer,size_t & offset)577 uint8_t MtpPacketTool::GetUInt8(const std::vector<uint8_t> &buffer, size_t &offset) 578 { 579 uint8_t value = (uint16_t)buffer[offset]; 580 offset += sizeof(uint8_t); 581 return value; 582 } 583 GetUInt16(const std::vector<uint8_t> & buffer,size_t & offset)584 uint16_t MtpPacketTool::GetUInt16(const std::vector<uint8_t> &buffer, size_t &offset) 585 { 586 uint16_t value = (uint16_t)buffer[offset] | ((uint16_t)buffer[offset + OFFSET_1] << BIT_8); 587 offset += sizeof(uint16_t); 588 return value; 589 } 590 GetUInt32(const std::vector<uint8_t> & buffer,size_t & offset)591 uint32_t MtpPacketTool::GetUInt32(const std::vector<uint8_t> &buffer, size_t &offset) 592 { 593 uint32_t value = (uint32_t)buffer[offset] | ((uint32_t)buffer[offset + OFFSET_1] << BIT_8) | 594 ((uint32_t)buffer[offset + OFFSET_2] << BIT_16) | ((uint32_t)buffer[offset + OFFSET_3] << BIT_24); 595 offset += sizeof(uint32_t); 596 return value; 597 } 598 GetUInt8(const std::vector<uint8_t> & buffer,size_t & offset,uint8_t & value)599 bool MtpPacketTool::GetUInt8(const std::vector<uint8_t> &buffer, size_t &offset, uint8_t &value) 600 { 601 if (buffer.size() < sizeof(uint8_t) + offset) { 602 MEDIA_ERR_LOG("MtpPacketTool::GetUInt8, size incorrect"); 603 return false; 604 } 605 606 value = buffer[offset]; 607 offset += sizeof(uint8_t); 608 return true; 609 } 610 GetUInt16(const std::vector<uint8_t> & buffer,size_t & offset,uint16_t & value)611 bool MtpPacketTool::GetUInt16(const std::vector<uint8_t> &buffer, size_t &offset, uint16_t &value) 612 { 613 if (buffer.size() < sizeof(uint16_t) + offset) { 614 MEDIA_ERR_LOG("MtpPacketTool::GetUInt16, size incorrect"); 615 return false; 616 } 617 618 value = (uint32_t)buffer[offset] | ((uint32_t)buffer[offset + OFFSET_1] << BIT_8); 619 offset += sizeof(uint16_t); 620 return true; 621 } 622 GetUInt32(const std::vector<uint8_t> & buffer,size_t & offset,uint32_t & value)623 bool MtpPacketTool::GetUInt32(const std::vector<uint8_t> &buffer, size_t &offset, uint32_t &value) 624 { 625 if (buffer.size() < sizeof(uint32_t) + offset) { 626 MEDIA_ERR_LOG("MtpPacketTool::GetUInt32, size incorrect"); 627 return false; 628 } 629 630 value = (uint32_t)buffer[offset] | ((uint32_t)buffer[offset + OFFSET_1] << BIT_8) | 631 ((uint32_t)buffer[offset + OFFSET_2] << BIT_16) | ((uint32_t)buffer[offset + OFFSET_3] << BIT_24); 632 offset += sizeof(uint32_t); 633 return true; 634 } 635 GetUInt64(const std::vector<uint8_t> & buffer,size_t & offset,uint64_t & value)636 bool MtpPacketTool::GetUInt64(const std::vector<uint8_t> &buffer, size_t &offset, uint64_t &value) 637 { 638 if (buffer.size() < sizeof(uint64_t) + offset) { 639 MEDIA_ERR_LOG("MtpPacketTool::GetUInt64, size incorrect"); 640 return false; 641 } 642 643 value = buffer[offset] | (buffer[offset + OFFSET_1] << BIT_8) | (buffer[offset + OFFSET_2] << BIT_16) | 644 (buffer[offset + OFFSET_3] << BIT_24) | (static_cast<uint64_t>(buffer[offset + OFFSET_4]) << BIT_32) | 645 (static_cast<uint64_t>(buffer[offset + OFFSET_5]) << BIT_40) | 646 (static_cast<uint64_t>(buffer[offset + OFFSET_6]) << BIT_48) | 647 (static_cast<uint64_t>(buffer[offset + OFFSET_7]) << BIT_56); 648 offset += sizeof(uint64_t); 649 return true; 650 } 651 GetUInt128(const std::vector<uint8_t> & buffer,size_t & offset,uint128_t & value)652 bool MtpPacketTool::GetUInt128(const std::vector<uint8_t> &buffer, size_t &offset, uint128_t &value) 653 { 654 bool cond = (!GetUInt32(buffer, offset, value[OFFSET_0]) || !GetUInt32(buffer, offset, value[OFFSET_1]) || 655 !GetUInt32(buffer, offset, value[OFFSET_2]) || !GetUInt32(buffer, offset, value[OFFSET_3])); 656 CHECK_AND_RETURN_RET(!cond, false); 657 return true; 658 } 659 GetInt8(const std::vector<uint8_t> & buffer,size_t & offset,int8_t & value)660 bool MtpPacketTool::GetInt8(const std::vector<uint8_t> &buffer, size_t &offset, int8_t &value) 661 { 662 uint8_t uValue = 0; 663 if (!GetUInt8(buffer, offset, uValue)) { 664 return false; 665 } 666 value = static_cast<int8_t>(uValue); 667 return true; 668 } 669 GetInt16(const std::vector<uint8_t> & buffer,size_t & offset,int16_t & value)670 bool MtpPacketTool::GetInt16(const std::vector<uint8_t> &buffer, size_t &offset, int16_t &value) 671 { 672 uint16_t uValue = 0; 673 if (!GetUInt16(buffer, offset, uValue)) { 674 return false; 675 } 676 value = static_cast<int16_t>(uValue); 677 return true; 678 } 679 GetInt32(const std::vector<uint8_t> & buffer,size_t & offset,int32_t & value)680 bool MtpPacketTool::GetInt32(const std::vector<uint8_t> &buffer, size_t &offset, int32_t &value) 681 { 682 uint32_t uValue = 0; 683 if (!GetUInt32(buffer, offset, uValue)) { 684 return false; 685 } 686 value = static_cast<int32_t>(uValue); 687 return true; 688 } GetInt64(const std::vector<uint8_t> & buffer,size_t & offset,int64_t & value)689 bool MtpPacketTool::GetInt64(const std::vector<uint8_t> &buffer, size_t &offset, int64_t &value) 690 { 691 uint64_t uValue = 0; 692 if (!GetUInt64(buffer, offset, uValue)) { 693 return false; 694 } 695 value = static_cast<int64_t>(uValue); 696 return true; 697 } 698 GetInt128(const std::vector<uint8_t> & buffer,size_t & offset,int128_t & value)699 bool MtpPacketTool::GetInt128(const std::vector<uint8_t> &buffer, size_t &offset, int128_t &value) 700 { 701 uint128_t uValue = {0}; 702 bool cond = (!GetUInt32(buffer, offset, uValue[OFFSET_0]) || !GetUInt32(buffer, offset, uValue[OFFSET_1]) || 703 !GetUInt32(buffer, offset, uValue[OFFSET_2]) || !GetUInt32(buffer, offset, uValue[OFFSET_3])); 704 CHECK_AND_RETURN_RET(!cond, false); 705 706 value[OFFSET_0] = static_cast<int32_t>(uValue[OFFSET_0]); 707 value[OFFSET_1] = static_cast<int32_t>(uValue[OFFSET_1]); 708 value[OFFSET_2] = static_cast<int32_t>(uValue[OFFSET_2]); 709 value[OFFSET_3] = static_cast<int32_t>(uValue[OFFSET_3]); 710 return true; 711 } 712 GetAUInt16(const std::vector<uint8_t> & buffer,size_t & offset)713 std::shared_ptr<UInt16List> MtpPacketTool::GetAUInt16(const std::vector<uint8_t> &buffer, size_t &offset) 714 { 715 std::shared_ptr<UInt16List> result = std::make_shared<UInt16List>(); 716 717 uint32_t count = GetUInt32(buffer, offset); 718 uint16_t value = 0; 719 for (uint32_t i = 0; i < count; i++) { 720 if (!GetUInt16(buffer, offset, value)) { 721 MEDIA_ERR_LOG("MtpPacketTool::GetAUInt16, count=%{public}d, i=%{public}d", count, i); 722 break; 723 } 724 result->push_back(value); 725 } 726 727 return result; 728 } 729 GetAUInt32(const std::vector<uint8_t> & buffer,size_t & offset)730 std::shared_ptr<UInt32List> MtpPacketTool::GetAUInt32(const std::vector<uint8_t> &buffer, size_t &offset) 731 { 732 std::shared_ptr<UInt32List> result = std::make_shared<UInt32List>(); 733 734 uint32_t count = GetUInt32(buffer, offset); 735 uint32_t value = 0; 736 for (uint32_t i = 0; i < count; i++) { 737 if (!GetUInt32(buffer, offset, value)) { 738 MEDIA_ERR_LOG("MtpPacketTool::GetAUInt32, count=%{public}d, i=%{public}d", count, i); 739 break; 740 } 741 result->push_back(value); 742 } 743 744 return result; 745 } 746 GetString(const std::vector<uint8_t> & buffer,size_t & offset)747 std::string MtpPacketTool::GetString(const std::vector<uint8_t> &buffer, size_t &offset) 748 { 749 uint8_t count = GetUInt8(buffer, offset); 750 if (count < 1) { 751 return std::string(); 752 } 753 std::vector<char16_t> tmpbuf(count); 754 uint16_t ch = 0; 755 for (int i = 0; i < count; i++) { 756 ch = GetUInt16(buffer, offset); 757 tmpbuf[i] = ch; 758 } 759 std::string String = Utf16ToUtf8(std::u16string(tmpbuf.data())); 760 return String; 761 } 762 GetString(const std::vector<uint8_t> & buffer,size_t & offset,std::string & str)763 bool MtpPacketTool::GetString(const std::vector<uint8_t> &buffer, size_t &offset, std::string &str) 764 { 765 uint8_t count = 0; 766 if (!GetUInt8(buffer, offset, count)) { 767 return false; 768 } 769 770 if (count < 1) { 771 str = std::string(); 772 return true; 773 } 774 775 std::vector<char16_t> tmpbuf(count); 776 uint16_t ch = 0; 777 for (int i = 0; ((i < count) && ((offset + sizeof(uint16_t) - 1) < buffer.size())); i++) { 778 if (!GetUInt16(buffer, offset, ch)) { 779 return false; 780 } 781 tmpbuf[i] = ch; 782 } 783 784 str = Utf16ToUtf8(std::u16string(tmpbuf.data())); 785 return true; 786 } 787 FormatDateTime(time_t sec)788 std::string MtpPacketTool::FormatDateTime(time_t sec) 789 { 790 struct tm tm; 791 char buffer[TIME_LENGTH] = {0}; 792 localtime_r(&sec, &tm); 793 if (sprintf_s(buffer, sizeof(buffer), "%04d%02d%02dT%02d%02d%02d", tm.tm_year + BEGIN_YEAR, tm.tm_mon + 1, 794 tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec) == -1) { 795 return ""; 796 } 797 return std::string(buffer); 798 } 799 GetOperationName(uint16_t code)800 const std::string &MtpPacketTool::GetOperationName(uint16_t code) 801 { 802 return CodeToStrByMap(code, OperationMap); 803 } 804 GetFormatName(uint16_t code)805 const std::string &MtpPacketTool::GetFormatName(uint16_t code) 806 { 807 return CodeToStrByMap(code, FormatMap); 808 } 809 GetObjectPropName(uint16_t code)810 const std::string &MtpPacketTool::GetObjectPropName(uint16_t code) 811 { 812 return CodeToStrByMap(code, ObjectPropMap); 813 } 814 GetDataTypeName(int type)815 const std::string &MtpPacketTool::GetDataTypeName(int type) 816 { 817 return CodeToStrByMap(type, DataTypeMap); 818 } 819 GetEventName(uint16_t code)820 const std::string &MtpPacketTool::GetEventName(uint16_t code) 821 { 822 return CodeToStrByMap(code, EventMap); 823 } 824 GetAssociationName(int type)825 const std::string &MtpPacketTool::GetAssociationName(int type) 826 { 827 return CodeToStrByMap(type, AssociationMap); 828 } 829 CodeToStrByMap(int type,const std::map<int,std::string> & theMap)830 const std::string &MtpPacketTool::CodeToStrByMap(int type, const std::map<int, std::string> &theMap) 831 { 832 auto codeSearch = theMap.find(type); 833 return (codeSearch != theMap.end()) ? codeSearch->second : UNKNOWN_STR; 834 } 835 CodeToStrByMap(uint32_t code,const std::map<uint32_t,std::string> & theMap)836 const std::string &MtpPacketTool::CodeToStrByMap(uint32_t code, const std::map<uint32_t, std::string> &theMap) 837 { 838 auto codeSearch = theMap.find(code); 839 return (codeSearch != theMap.end()) ? codeSearch->second : UNKNOWN_STR; 840 } 841 GetObjectPropTypeByPropCode(uint16_t propCode)842 int MtpPacketTool::GetObjectPropTypeByPropCode(uint16_t propCode) 843 { 844 auto propCodeSearch = ObjectPropTypeMap.find(propCode); 845 return (propCodeSearch != ObjectPropTypeMap.end()) ? propCodeSearch->second : MTP_TYPE_UNDEFINED_CODE; 846 } 847 Int8ToString(const int8_t & value,std::string & outStr)848 bool MtpPacketTool::Int8ToString(const int8_t &value, std::string &outStr) 849 { 850 char tmpbuf[BIT_32] = {0}; 851 CHECK_AND_RETURN_RET(sprintf_s(tmpbuf, sizeof(tmpbuf), "hex=%02x, dec=%d", value, value) != -1, false); 852 outStr.assign(tmpbuf); 853 return true; 854 } 855 UInt8ToString(const uint8_t & value,std::string & outStr)856 bool MtpPacketTool::UInt8ToString(const uint8_t &value, std::string &outStr) 857 { 858 char tmpbuf[BIT_32] = {0}; 859 CHECK_AND_RETURN_RET(sprintf_s(tmpbuf, sizeof(tmpbuf), "hex=%02x, dec=%u", value, value) != -1, false); 860 outStr.assign(tmpbuf); 861 return true; 862 } 863 Int16ToString(const int16_t & value,std::string & outStr)864 bool MtpPacketTool::Int16ToString(const int16_t &value, std::string &outStr) 865 { 866 char tmpbuf[BIT_32] = {0}; 867 CHECK_AND_RETURN_RET(sprintf_s(tmpbuf, sizeof(tmpbuf), "hex=%04x, dec=%d", value, value) != -1, false); 868 outStr.assign(tmpbuf); 869 return true; 870 } 871 UInt16ToString(const uint16_t & value,std::string & outStr)872 bool MtpPacketTool::UInt16ToString(const uint16_t &value, std::string &outStr) 873 { 874 char tmpbuf[BIT_32] = {0}; 875 CHECK_AND_RETURN_RET(sprintf_s(tmpbuf, sizeof(tmpbuf), "hex=%04x, dec=%u", value, value) != -1, false); 876 outStr.assign(tmpbuf); 877 return true; 878 } 879 Int32ToString(const int32_t & value,std::string & outStr)880 bool MtpPacketTool::Int32ToString(const int32_t &value, std::string &outStr) 881 { 882 char tmpbuf[BIT_64] = {0}; 883 CHECK_AND_RETURN_RET(sprintf_s(tmpbuf, sizeof(tmpbuf), "hex=%08x, dec=%d", value, value) != -1, false); 884 outStr.assign(tmpbuf); 885 return true; 886 } 887 UInt32ToString(const uint32_t & value,std::string & outStr)888 bool MtpPacketTool::UInt32ToString(const uint32_t &value, std::string &outStr) 889 { 890 char tmpbuf[BIT_64] = {0}; 891 CHECK_AND_RETURN_RET(sprintf_s(tmpbuf, sizeof(tmpbuf), "hex=%08x, dec=%u", value, value) != -1, false); 892 outStr.assign(tmpbuf); 893 return true; 894 } 895 Int64ToString(const int64_t & value,std::string & outStr)896 bool MtpPacketTool::Int64ToString(const int64_t &value, std::string &outStr) 897 { 898 char tmpbuf[BIT_64] = {0}; 899 CHECK_AND_RETURN_RET(sprintf_s(tmpbuf, sizeof(tmpbuf), "hex=%016" PRIx64 ", dec=%" PRIi64 "", 900 value, value) != -1, false); 901 outStr.assign(tmpbuf); 902 return true; 903 } 904 UInt64ToString(const uint64_t & value,std::string & outStr)905 bool MtpPacketTool::UInt64ToString(const uint64_t &value, std::string &outStr) 906 { 907 char tmpbuf[BIT_64] = {0}; 908 CHECK_AND_RETURN_RET(sprintf_s(tmpbuf, sizeof(tmpbuf), "hex=%016" PRIx64 ", dec=%" PRIu64 "", 909 value, value) != -1, false); 910 outStr.assign(tmpbuf); 911 return true; 912 } 913 Int128ToString(const int128_t & value,std::string & outStr)914 bool MtpPacketTool::Int128ToString(const int128_t &value, std::string &outStr) 915 { 916 char tmpbuf[BIT_128] = {0}; 917 CHECK_AND_RETURN_RET(sprintf_s(tmpbuf, sizeof(tmpbuf), "hex=(%08x,%08x,%08x,%08x), dec=(%d,%d,%d,%d)", 918 value[OFFSET_0], value[OFFSET_1], value[OFFSET_2], value[OFFSET_3], value[OFFSET_0], value[OFFSET_1], 919 value[OFFSET_2], value[OFFSET_3]) != -1, false); 920 outStr.assign(tmpbuf); 921 return true; 922 } 923 UInt128ToString(const uint128_t & value,std::string & outStr)924 bool MtpPacketTool::UInt128ToString(const uint128_t &value, std::string &outStr) 925 { 926 char tmpbuf[BIT_128] = {0}; 927 if (sprintf_s(tmpbuf, sizeof(tmpbuf), "hex=(%08x,%08x,%08x,%08x), dec=(%u,%u,%u,%u)", value[OFFSET_0], 928 value[OFFSET_1], value[OFFSET_2], value[OFFSET_3], value[OFFSET_0], value[OFFSET_1], value[OFFSET_2], 929 value[OFFSET_3]) == -1) { 930 return false; 931 } 932 outStr.assign(tmpbuf); 933 return true; 934 } 935 StrToString(const std::string & value)936 std::string MtpPacketTool::StrToString(const std::string &value) 937 { 938 std::string str; 939 str.append("length:"); 940 str.append(std::to_string(value.length())); 941 str.append(", content:["); 942 str.append(value); 943 str.append("]"); 944 return str; 945 } 946 GetIndentBlank()947 const std::string &MtpPacketTool::GetIndentBlank() 948 { 949 return INDENT_BLANKSTR; 950 } 951 GetIndentBlank(size_t indent)952 std::string MtpPacketTool::GetIndentBlank(size_t indent) 953 { 954 size_t maxNum = BLANK_STR.length(); 955 size_t num = indent * INDENT_SIZE; 956 957 std::string indentStr = BLANK_STR.substr(0, ((num > maxNum) ? maxNum : num)); 958 return indentStr; 959 } 960 CanDump()961 bool MtpPacketTool::CanDump() 962 { 963 std::string mtpShowDump = OHOS::system::GetParameter(KEY_MTP_SHOW_DUMP, MTP_SHOW_DUMP_DEFAULT); 964 return mtpShowDump.compare(ALLOW_SHOW_DUMP) == 0; 965 } 966 DumpPacket(const std::vector<uint8_t> & outBuffer)967 void MtpPacketTool::DumpPacket(const std::vector<uint8_t> &outBuffer) 968 { 969 if (!MtpPacketTool::CanDump()) { 970 MEDIA_DEBUG_LOG("MtpPacketTool::CanDump return false"); 971 return; 972 } 973 int offset = 0; 974 uint32_t containerLength = MtpPacketTool::GetUInt32(outBuffer[offset], outBuffer[offset + OFFSET_1], 975 outBuffer[offset + OFFSET_2], outBuffer[offset + OFFSET_3]); 976 uint16_t containerType = MtpPacketTool::GetUInt16(outBuffer[offset + OFFSET_4], 977 outBuffer[offset + OFFSET_5]); 978 if (containerType == DATA_CONTAINER_TYPE) { 979 MEDIA_DEBUG_LOG("Packet type: %{public}d, Payload Size: %{public}d", 980 DATA_CONTAINER_TYPE, containerLength - PACKET_HEADER_LENGETH); 981 MtpPacketTool::Dump(outBuffer, 0, PACKET_HEADER_LENGETH); 982 } else { 983 MEDIA_DEBUG_LOG("Packet type: %{public}d, Packet size: %{public}d", 984 containerType, containerLength); 985 MtpPacketTool::Dump(outBuffer); 986 } 987 } 988 Dump(const std::vector<uint8_t> & data,uint32_t offset,uint32_t sum)989 void MtpPacketTool::Dump(const std::vector<uint8_t> &data, uint32_t offset, uint32_t sum) 990 { 991 CHECK_AND_RETURN_LOG(data.size() > 0, "Dump data is empty"); 992 993 std::unique_ptr<char[]> hexBuf = std::make_unique<char[]>(DUMP_HEXBUF_MAX); 994 std::unique_ptr<char[]> txtBuf = std::make_unique<char[]>(DUMP_TXTBUF_MAX); 995 if (!DumpClear(offset, hexBuf, DUMP_HEXBUF_MAX, txtBuf, DUMP_TXTBUF_MAX)) { 996 return; 997 } 998 const size_t datasize = data.size(); 999 for (size_t loc = 0, cur = offset; ((loc < sum) && (cur < datasize)); loc++, cur++) { 1000 if (!DumpChar(data[cur], hexBuf, DUMP_HEXBUF_MAX, txtBuf, DUMP_TXTBUF_MAX)) { 1001 return; 1002 } 1003 size_t idx = (loc & BUF_0F); 1004 if (strcat_s(hexBuf.get(), DUMP_HEXBUF_MAX, ((idx != BUF_07) ? " " : "-")) != EOK) { 1005 return; 1006 } 1007 if (idx != BUF_0F) { 1008 continue; 1009 } 1010 DumpShow(hexBuf, DUMP_HEXBUF_MAX, txtBuf, DUMP_TXTBUF_MAX); 1011 if (!DumpClear(loc + 1, hexBuf, DUMP_HEXBUF_MAX, txtBuf, DUMP_TXTBUF_MAX)) { 1012 return; 1013 } 1014 } 1015 DumpShow(hexBuf, DUMP_HEXBUF_MAX, txtBuf, DUMP_TXTBUF_MAX); 1016 } 1017 DumpClear(size_t loc,std::unique_ptr<char[]> & hexBuf,int hexBufSize,std::unique_ptr<char[]> & txtBuf,int txtBufSize)1018 bool MtpPacketTool::DumpClear(size_t loc, std::unique_ptr<char[]> &hexBuf, int hexBufSize, 1019 std::unique_ptr<char[]> &txtBuf, int txtBufSize) 1020 { 1021 if ((hexBuf == nullptr) || (txtBuf == nullptr)) { 1022 return false; 1023 } 1024 1025 if (sprintf_s(hexBuf.get(), hexBufSize, "%08X : ", static_cast<uint32_t>(loc)) == -1) { 1026 return false; 1027 } 1028 if (sprintf_s(txtBuf.get(), txtBufSize, "%s", "") == -1) { 1029 return false; 1030 } 1031 return true; 1032 } 1033 DumpChar(uint8_t u8,std::unique_ptr<char[]> & hexBuf,int hexBufSize,std::unique_ptr<char[]> & txtBuf,int txtBufSize)1034 bool MtpPacketTool::DumpChar(uint8_t u8, std::unique_ptr<char[]> &hexBuf, int hexBufSize, 1035 std::unique_ptr<char[]> &txtBuf, int txtBufSize) 1036 { 1037 if ((hexBuf == nullptr) || (txtBuf == nullptr)) { 1038 return false; 1039 } 1040 1041 char hexTmp[BIT_4] = {0}; 1042 if (sprintf_s(hexTmp, sizeof(hexTmp), "%02X", u8) == -1) { 1043 return false; 1044 } 1045 1046 int intData = static_cast<int>(u8); 1047 char txtTmp[BIT_4] = {0}; 1048 if (isprint(intData)) { 1049 if (sprintf_s(txtTmp, sizeof(txtTmp), "%d", intData) == -1) { 1050 return false; 1051 } 1052 } else { 1053 if (sprintf_s(txtTmp, sizeof(txtTmp), "%c", '.') == -1) { 1054 return false; 1055 } 1056 } 1057 1058 if (strcat_s(hexBuf.get(), hexBufSize, hexTmp) != EOK) { 1059 return false; 1060 } 1061 if (strcat_s(txtBuf.get(), txtBufSize, txtTmp) != EOK) { 1062 return false; 1063 } 1064 return true; 1065 } 1066 DumpShow(const std::unique_ptr<char[]> & hexBuf,int hexBufSize,const std::unique_ptr<char[]> & txtBuf,int txtBufSize)1067 void MtpPacketTool::DumpShow(const std::unique_ptr<char[]> &hexBuf, int hexBufSize, 1068 const std::unique_ptr<char[]> &txtBuf, int txtBufSize) 1069 { 1070 if ((hexBuf == nullptr) || (txtBuf == nullptr)) { 1071 return; 1072 } 1073 if ((hexBuf[OFFSET_0] == '\0') || (txtBuf[OFFSET_0] == '\0')) { 1074 return; 1075 } 1076 1077 MEDIA_DEBUG_LOG("%-60s %s", hexBuf.get(), txtBuf.get()); 1078 } 1079 } // namespace Media 1080 } // namespace OHOS