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