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 #ifndef FRAMEWORKS_SERVICES_MEDIA_MTP_INCLUDE_MTP_DATA_UTILS_H_ 16 #define FRAMEWORKS_SERVICES_MEDIA_MTP_INCLUDE_MTP_DATA_UTILS_H_ 17 #include <memory> 18 #include <vector> 19 #include <string> 20 #include <variant> 21 #include <sys/time.h> 22 #include <stdio.h> 23 #include <unordered_map> 24 25 #include "datashare_result_set.h" 26 #include "mtp_operation_context.h" 27 #include "property.h" 28 #include "userfile_manager_types.h" 29 #include "result_set_utils.h" 30 31 namespace OHOS { 32 namespace Media { 33 struct PropertyValue { 34 uint64_t outIntVal = 0; 35 uint128_t outLongVal = {0}; 36 std::string outStrVal; 37 }; 38 struct MovingType { 39 uint64_t parent; 40 std::string displayName; 41 }; 42 const std::string MTP_FORMAT_ALL = ".all"; // Undefined 43 const std::string MTP_FORMAT_UNDEFINED = ".undefined"; // Undefined 44 const std::string MTP_FORMAT_ASSOCIATION = ".floader"; // associations (folders and directories) 45 const std::string MTP_FORMAT_SCRIPT = ".js"; // script files 46 const std::string MTP_FORMAT_EXECUTABLE = ".exe"; // executable files 47 const std::string MTP_FORMAT_TEXT = ".txt"; // text files 48 const std::string MTP_FORMAT_HTML = ".html"; // HTML files 49 const std::string MTP_FORMAT_DPOF = ".dp"; // DPOF files 50 const std::string MTP_FORMAT_AIFF = ".aiff"; // AIFF audio files 51 const std::string MTP_FORMAT_WAV = ".wav"; // WAV audio files 52 const std::string MTP_FORMAT_MP3 = ".mp3"; // MP3 audio files 53 const std::string MTP_FORMAT_AVI = ".avi"; // AVI video files 54 const std::string MTP_FORMAT_MPEG = ".mpeg"; // MPEG video files 55 const std::string MTP_FORMAT_ASF = ".asf"; // ASF files 56 // Unknown image files which are not specified in PTP specification 57 const std::string MTP_FORMAT_DEFINED = ".image"; // Unknown image files 58 const std::string MTP_FORMAT_HEIC = ".heic"; // HEIC image files 59 const std::string MTP_FORMAT_HEICS = ".heics"; // HEICS image files 60 const std::string MTP_FORMAT_HEIFS = ".heifs"; // HEIFS image files 61 const std::string MTP_FORMAT_BM = ".bm"; // BM image files 62 const std::string MTP_FORMAT_HEIF = ".heif"; // HEIF image files 63 const std::string MTP_FORMAT_HIF = ".hif"; // HIF image files 64 const std::string MTP_FORMAT_AVIF = ".avif"; // AVIF image files 65 const std::string MTP_FORMAT_CUR = ".cur"; // CUR image files 66 const std::string MTP_FORMAT_WEBP = ".webp"; // WEBP image files 67 const std::string MTP_FORMAT_DNG = ".dng"; // DNG image files 68 const std::string MTP_FORMAT_RAF = ".raf"; // RAF image files 69 const std::string MTP_FORMAT_ICO = ".ico"; // ICO image files 70 const std::string MTP_FORMAT_NRW = ".nrw"; // NRW image files 71 const std::string MTP_FORMAT_RW2 = ".rw2"; // RW2 image files 72 const std::string MTP_FORMAT_PEF = ".pef"; // PEF image files 73 const std::string MTP_FORMAT_SRW = ".srw"; // SRW image files 74 const std::string MTP_FORMAT_ARW = ".arw"; // ARW image files 75 const std::string MTP_FORMAT_SVG = ".svg"; // SVG image files 76 const std::string MTP_FORMAT_RAW = ".raw"; // RAW image files 77 const std::string MTP_FORMAT_EXIF_JPEG = ".jpeg?.jpg"; // JPEG image files 78 const std::string MTP_FORMAT_JPEG = ".jpeg"; 79 const std::string MTP_FORMAT_JPG = ".jpg"; 80 const std::string MTP_FORMAT_TIFF_EP = ".tiff"; // TIFF EP image files 81 const std::string MTP_FORMAT_FLASHPIX = ".swf"; 82 const std::string MTP_FORMAT_BMP = ".bmp"; // BMP image files 83 const std::string MTP_FORMAT_CIFF = ".ciff"; 84 const std::string MTP_FORMAT_GIF = ".giff"; // GIF image files 85 const std::string MTP_FORMAT_JFIF = ".jsif"; // JFIF image files 86 const std::string MTP_FORMAT_CD = ".cd"; 87 const std::string MTP_FORMAT_PICT = ".pict"; // PICT image files 88 const std::string MTP_FORMAT_PNG = ".png"; // PNG image files 89 const std::string MTP_FORMAT_TIFF = ".tif"; // TIFF image files 90 const std::string MTP_FORMAT_TIFF_IT = ".tiff"; 91 const std::string MTP_FORMAT_JP2 = ".jp2"; // JP2 files 92 const std::string MTP_FORMAT_JPX = ".jpx"; // JPX files 93 const std::string MTP_FORMAT_UNDEFINED_FIRMWARE = ".undefinedfirmware"; // firmware files 94 const std::string MTP_FORMAT_WINDOWS_IMAGE_FORMAT = ".img"; // Windows image files 95 const std::string MTP_FORMAT_UNDEFINED_AUDIO = ".undefinedaudio"; // undefined audio files files 96 const std::string MTP_FORMAT_WMA = ".wma"; // WMA audio files 97 const std::string MTP_FORMAT_OGG = ".ogg"; // OGG audio files 98 const std::string MTP_FORMAT_AAC = ".aac"; // AAC audio files 99 const std::string MTP_FORMAT_AUDIBLE = ".aa"; // Audible audio files 100 const std::string MTP_FORMAT_FLAC = ".flac"; // FLAC audio files 101 const std::string MTP_FORMAT_UNDEFINED_VIDEO = ".undefinedvideo"; // undefined video files 102 const std::string MTP_FORMAT_WMV = ".wmv"; // WMV video files 103 const std::string MTP_FORMAT_MP4_CONTAINER = ".mp4"; // MP4 files 104 const std::string MTP_FORMAT_MP2 = ".mp2"; // MP2 files 105 const std::string MTP_FORMAT_3GP_CONTAINER = ".3gp"; // 3GP files 106 const std::string MTP_FORMAT_3GPP2 = ".3gpp2"; // 3GPP2 files 107 const std::string MTP_FORMAT_3GP2 = ".3gp2"; // 3GP2 files 108 const std::string MTP_FORMAT_3G2 = ".3g2"; // 3G2 files 109 const std::string MTP_FORMAT_3GPP = ".3gpp"; // 3GPP files 110 const std::string MTP_FORMAT_M4V = ".m4v"; // M4V files 111 const std::string MTP_FORMAT_F4V = ".f4v"; // F4V files 112 const std::string MTP_FORMAT_MP4V = ".mp4v"; // MP4V files 113 const std::string MTP_FORMAT_MPEG4 = ".mpeg4"; // MPEG4 files 114 const std::string MTP_FORMAT_M2TS = ".m2ts"; // M2TS files 115 const std::string MTP_FORMAT_MTS = ".mts"; // MTS files 116 const std::string MTP_FORMAT_TS = ".ts"; // TS files 117 const std::string MTP_FORMAT_YT = ".yt"; // YT files 118 const std::string MTP_FORMAT_WRF = ".wrf"; // WRF files 119 const std::string MTP_FORMAT_MPEG2 = ".mpeg2"; // MPEG2 files 120 const std::string MTP_FORMAT_MPV2 = ".mpv2"; // MPV2 files 121 const std::string MTP_FORMAT_MP2V = ".mp2v"; // MP2V files 122 const std::string MTP_FORMAT_M2V = ".m2v"; // M2V files 123 const std::string MTP_FORMAT_M2T = ".m2t"; // M2T files 124 const std::string MTP_FORMAT_MPEG1 = ".mpeg1"; // MPEG1 files 125 const std::string MTP_FORMAT_MPV1 = ".mpv1"; // MPV1 files 126 const std::string MTP_FORMAT_MP1V = ".mp1v"; // MP1V files 127 const std::string MTP_FORMAT_M1V = ".m1v"; // M1V files 128 const std::string MTP_FORMAT_MPG = ".mpg"; // MPG files 129 const std::string MTP_FORMAT_MOV = ".mov"; // MOV files 130 const std::string MTP_FORMAT_MKV = ".mkv"; // MKV files 131 const std::string MTP_FORMAT_WEBM = ".webm"; // WEBM files 132 const std::string MTP_FORMAT_H264 = ".h264"; // H264 files 133 const std::string MTP_FORMAT_UNDEFINED_COLLECTION = ".undefinedcollections"; // undefined collections 134 const std::string MTP_FORMAT_ABSTRACT_MULTIMEDIA_ALBUM = ".album"; // multimedia albums 135 const std::string MTP_FORMAT_ABSTRACT_IMAGE_ALBUM = ".albumimage"; // image albums 136 const std::string MTP_FORMAT_ABSTRACT_AUDIO_ALBUM = ".albumaudio"; // audio albums 137 const std::string MTP_FORMAT_ABSTRACT_VIDEO_ALBUM = ".albumvideo"; // video albums 138 const std::string MTP_FORMAT_ABSTRACT_AUDIO_VIDEO_PLAYLIST = ""; // abstract AV playlists 139 const std::string MTP_FORMAT_ABSTRACT_CONTACT_GROUP = ""; 140 const std::string MTP_FORMAT_ABSTRACT_MESSAGE_FOLDER = ".mesfloader"; 141 const std::string MTP_FORMAT_ABSTRACT_CHAPTERED_PRODUCTION = ""; 142 const std::string MTP_FORMAT_ABSTRACT_AUDIO_PLAYLIST = ".allaudio"; // abstract audio playlists 143 const std::string MTP_FORMAT_ABSTRACT_VIDEO_PLAYLIST = ".allvideo"; // abstract video playlists 144 const std::string MTP_FORMAT_ABSTRACT_MEDIACAST = ""; // abstract mediacasts 145 const std::string MTP_FORMAT_WPL_PLAYLIST = ".wpl"; // WPL playlist files 146 const std::string MTP_FORMAT_M3U_PLAYLIST = ".m3u"; // M3u playlist files 147 const std::string MTP_FORMAT_MPL_PLAYLIST = ".mpl"; // MPL playlist files 148 const std::string MTP_FORMAT_ASX_PLAYLIST = ".asx"; // ASX playlist files 149 const std::string MTP_FORMAT_PLS_PLAYLIST = ".pls"; // PLS playlist files 150 const std::string MTP_FORMAT_UNDEFINED_DOCUMENT = ".undefineddocument"; // undefined document files 151 const std::string MTP_FORMAT_ABSTRACT_DOCUMENT = ".alldocuments"; // abstract documents 152 const std::string MTP_FORMAT_XML_DOCUMENT = ".xml"; // XML documents 153 const std::string MTP_FORMAT_MICROSOFT_WORD_DOCUMENT = ".doc"; // MS Word documents 154 const std::string MTP_FORMAT_MHT_COMPILED_HTML_DOCUMENT = ".html"; 155 const std::string MTP_FORMAT_MICROSOFT_EXCEL_SPREADSHEET = ""; // MS Excel spreadsheets 156 const std::string MTP_FORMAT_MICROSOFT_POWERPOINT_PRESENTATION = ""; // MS PowerPoint presentatiosn 157 const std::string MTP_FORMAT_UNDEFINED_MESSAGE = ""; 158 const std::string MTP_FORMAT_ABSTRACT_MESSAGE = ""; 159 const std::string MTP_FORMAT_UNDEFINED_CONTACT = ""; 160 const std::string MTP_FORMAT_ABSTRACT_CONTACT = ""; 161 const std::string MTP_FORMAT_VCARD_2 = ""; 162 163 class MtpDataUtils { 164 public: 165 static int32_t SolveHandlesFormatData(const uint16_t format, std::string &outExtension, MediaType &outMediaType); 166 static int32_t SolveSendObjectFormatData(const uint16_t format, MediaType &outMediaType); 167 static int32_t SolveSetObjectPropValueData(const std::shared_ptr<MtpOperationContext> &context, 168 std::string &outColName, std::variant<int64_t, std::string> &outColVal); 169 static void GetMediaTypeByformat(const uint16_t format, MediaType &outMediaType); 170 static void GetPropGropByMediaType(const MediaType &mediaType, std::vector<std::string> &outPropGrop); 171 static int32_t GetPropListBySet(const std::shared_ptr<MtpOperationContext> &context, 172 const std::shared_ptr<DataShare::DataShareResultSet> &resultSet, 173 std::shared_ptr<std::vector<Property>> &outProps); 174 static int32_t GetPropValueBySet(const uint32_t property, 175 const std::shared_ptr<DataShare::DataShareResultSet> &resultSet, 176 PropertyValue &outPropValue); 177 static int32_t GetMediaTypeByName(std::string &displayName, MediaType &outMediaType); 178 // MTP 179 static int32_t GetMtpPropList(const std::shared_ptr<std::unordered_map<uint32_t, std::string>> &handles, 180 const std::unordered_map<std::string, uint32_t> &pathHandles, 181 const std::shared_ptr<MtpOperationContext> &context, shared_ptr<vector<Property>> &outPropValue); 182 static int32_t GetMtpPropValue(const std::string &path, 183 const uint32_t property, const uint16_t format, PropertyValue &outPropValue); 184 static uint32_t GetMtpFormatByPath(const std::string &path, uint16_t &outFormat); 185 static std::string GetMovingOrEnditSourcePath(const std::string &path, const int32_t &subtype, 186 const std::shared_ptr<MtpOperationContext> &context); 187 private: 188 static int32_t GetPropList(const std::shared_ptr<MtpOperationContext> &context, 189 const std::shared_ptr<DataShare::DataShareResultSet> &resultSet, 190 const std::shared_ptr<UInt16List> &properties, std::shared_ptr<std::vector<Property>> &outProps); 191 static void GetFormatByPath(const std::string &path, uint16_t &outFormat); 192 static std::variant<int32_t, int64_t, std::string> ReturnError(const std::string &errMsg, 193 const ResultSetDataType &type); 194 static int32_t GetFormat(const std::shared_ptr<DataShare::DataShareResultSet> &resultSet, uint16_t &outFormat); 195 static void GetOneRowPropList(uint32_t handle, const std::shared_ptr<DataShare::DataShareResultSet> &resultSet, 196 const std::shared_ptr<UInt16List> &properties, std::shared_ptr<std::vector<Property>> &outProps); 197 static void GetOneRowPropVal(const std::shared_ptr<DataShare::DataShareResultSet> &resultSet, 198 const uint32_t property, PropertyValue &outPropValue); 199 static void SetOneDefaultlPropList(uint32_t handle, 200 uint16_t property, std::shared_ptr<std::vector<Property>> &outProps); 201 static void SetProperty(const std::string &column, 202 const std::shared_ptr<DataShare::DataShareResultSet> &resultSet, ResultSetDataType &type, Property &prop); 203 // MTP 204 static void GetMtpOneRowProp(const std::shared_ptr<UInt16List> &properties, const uint32_t parentId, 205 std::unordered_map<uint32_t, std::string>::iterator it, shared_ptr<vector<Property>> &outProps, 206 int32_t storageId); 207 static void SetMtpProperty(const std::string &column, const std::string &path, 208 ResultSetDataType &type, Property &prop); 209 static void SetMtpOneDefaultlPropList(uint32_t handle, 210 uint16_t property, std::shared_ptr<std::vector<Property>> &outProps, int32_t storageId); 211 static void SetPtpProperty(const std::string &column, const std::string &path, const MovingType &movingType, 212 Property &prop); 213 static void GetMovingOrEnditOneRowPropList(const shared_ptr<UInt16List> &properties, const std::string &path, 214 const std::shared_ptr<MtpOperationContext> &context, shared_ptr<vector<Property>> &outProps, 215 const MovingType &movingType); 216 }; 217 } // namespace Media 218 } // namespace OHOS 219 #endif // FRAMEWORKS_SERVICES_MEDIA_MTP_INCLUDE_MTP_DATA_UTILS_H_ 220