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 #include "payload_data/get_object_props_supported_data.h"
16 #include "media_log.h"
17 #include "media_mtp_utils.h"
18 #include "mtp_packet_tools.h"
19 using namespace std;
20 namespace OHOS {
21 namespace Media {
22 static constexpr int32_t PARSER_PARAM_SUM = 1;
23 static const std::vector<uint16_t> FILE_PROPERTIES = {
24 MTP_PROPERTY_STORAGE_ID_CODE,
25 MTP_PROPERTY_OBJECT_FORMAT_CODE,
26 MTP_PROPERTY_PROTECTION_STATUS_CODE,
27 MTP_PROPERTY_OBJECT_SIZE_CODE,
28 MTP_PROPERTY_OBJECT_FILE_NAME_CODE,
29 MTP_PROPERTY_DATE_MODIFIED_CODE,
30 MTP_PROPERTY_PARENT_OBJECT_CODE,
31 MTP_PROPERTY_PERSISTENT_UID_CODE,
32 MTP_PROPERTY_NAME_CODE,
33 MTP_PROPERTY_DISPLAY_NAME_CODE,
34 MTP_PROPERTY_DATE_ADDED_CODE,
35 };
36
37 static const std::vector<uint16_t> AUDIO_PROPERTIES = {
38 MTP_PROPERTY_ARTIST_CODE,
39 MTP_PROPERTY_ALBUM_NAME_CODE,
40 MTP_PROPERTY_ALBUM_ARTIST_CODE,
41 MTP_PROPERTY_TRACK_CODE,
42 MTP_PROPERTY_ORIGINAL_RELEASE_DATE_CODE,
43 MTP_PROPERTY_DURATION_CODE,
44 MTP_PROPERTY_GENRE_CODE,
45 MTP_PROPERTY_COMPOSER_CODE,
46 MTP_PROPERTY_AUDIO_WAVE_CODEC_CODE,
47 MTP_PROPERTY_BITRATE_TYPE_CODE,
48 MTP_PROPERTY_AUDIO_BITRATE_CODE,
49 MTP_PROPERTY_NUMBER_OF_CHANNELS_CODE,
50 MTP_PROPERTY_SAMPLE_RATE_CODE,
51 };
52
53 static const std::vector<uint16_t> VIDEO_PROPERTIES = {
54 MTP_PROPERTY_ARTIST_CODE,
55 MTP_PROPERTY_ALBUM_NAME_CODE,
56 MTP_PROPERTY_DURATION_CODE,
57 MTP_PROPERTY_DESCRIPTION_CODE
58 };
59
60 static const std::vector<uint16_t> IMAGE_PROPERTIES = {
61 MTP_PROPERTY_DESCRIPTION_CODE,
62 };
63
GetObjectPropsSupportedData(std::shared_ptr<MtpOperationContext> & context)64 GetObjectPropsSupportedData::GetObjectPropsSupportedData(std::shared_ptr<MtpOperationContext> &context)
65 : PayloadData(context)
66 {
67 }
68
~GetObjectPropsSupportedData()69 GetObjectPropsSupportedData::~GetObjectPropsSupportedData()
70 {
71 }
72
Parser(const std::vector<uint8_t> & buffer,int32_t readSize)73 int GetObjectPropsSupportedData::Parser(const std::vector<uint8_t> &buffer, int32_t readSize)
74 {
75 if ((context_ == nullptr) || (!context_->sessionOpen)) {
76 MEDIA_ERR_LOG("GetObjectPropsSupportedData::parser null or session");
77 return MTP_SESSION_NOT_OPEN_CODE;
78 }
79
80 int32_t parameterCount = (readSize - MTP_CONTAINER_HEADER_SIZE) / MTP_PARAMETER_SIZE;
81 if (parameterCount < PARSER_PARAM_SUM) {
82 MEDIA_ERR_LOG("GetObjectPropsSupportedData::parser paramCount=%{public}u, needCount=%{public}d",
83 parameterCount, PARSER_PARAM_SUM);
84 return MTP_INVALID_PARAMETER_CODE;
85 }
86
87 size_t offset = MTP_CONTAINER_HEADER_SIZE;
88 context_->format = MtpPacketTool::GetUInt32(buffer, offset);
89 return MTP_SUCCESS;
90 }
91
Maker(std::vector<uint8_t> & outBuffer)92 int GetObjectPropsSupportedData::Maker(std::vector<uint8_t> &outBuffer)
93 {
94 UInt16List properties;
95 GetObjectProps(properties);
96 MtpPacketTool::PutAUInt16(outBuffer, properties.data(), properties.size());
97 return MTP_SUCCESS;
98 }
99
CalculateSize()100 uint32_t GetObjectPropsSupportedData::CalculateSize()
101 {
102 std::vector<uint8_t> tmpVar;
103 int res = Maker(tmpVar);
104 if (res != MTP_SUCCESS) {
105 return res;
106 }
107 return tmpVar.size();
108 }
109
GetObjectProps(UInt16List & properties)110 void GetObjectPropsSupportedData::GetObjectProps(UInt16List &properties)
111 {
112 properties.assign(FILE_PROPERTIES.begin(), FILE_PROPERTIES.end());
113
114 switch (context_->format) {
115 case MTP_FORMAT_EXIF_JPEG_CODE:
116 case MTP_FORMAT_GIF_CODE:
117 case MTP_FORMAT_PNG_CODE:
118 case MTP_FORMAT_BMP_CODE: {
119 properties.insert(properties.end(), IMAGE_PROPERTIES.begin(), IMAGE_PROPERTIES.end());
120 break;
121 }
122 case MTP_FORMAT_MP3_CODE:
123 case MTP_FORMAT_WAV_CODE:
124 case MTP_FORMAT_WMA_CODE:
125 case MTP_FORMAT_OGG_CODE:
126 case MTP_FORMAT_AAC_CODE: {
127 properties.insert(properties.end(), AUDIO_PROPERTIES.begin(), AUDIO_PROPERTIES.end());
128 break;
129 }
130 case MTP_FORMAT_MPEG_CODE:
131 case MTP_FORMAT_3GP_CONTAINER_CODE:
132 case MTP_FORMAT_WMV_CODE: {
133 properties.insert(properties.end(), VIDEO_PROPERTIES.begin(), VIDEO_PROPERTIES.end());
134 break;
135 }
136 default:
137 break;
138 }
139 return;
140 }
141 } // namespace Media
142 } // namespace OHOS