• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 };
58 
59 static const std::vector<uint16_t> IMAGE_PROPERTIES = {
60 };
61 
GetObjectPropsSupportedData(std::shared_ptr<MtpOperationContext> & context)62 GetObjectPropsSupportedData::GetObjectPropsSupportedData(std::shared_ptr<MtpOperationContext> &context)
63     : PayloadData(context)
64 {
65 }
66 
~GetObjectPropsSupportedData()67 GetObjectPropsSupportedData::~GetObjectPropsSupportedData()
68 {
69 }
70 
Parser(const std::vector<uint8_t> & buffer,int32_t readSize)71 int GetObjectPropsSupportedData::Parser(const std::vector<uint8_t> &buffer, int32_t readSize)
72 {
73     if ((context_ == nullptr) || (!context_->sessionOpen)) {
74         MEDIA_ERR_LOG("GetObjectPropsSupportedData::parser null or session");
75         return MTP_SESSION_NOT_OPEN_CODE;
76     }
77 
78     int32_t parameterCount = (readSize - MTP_CONTAINER_HEADER_SIZE) / MTP_PARAMETER_SIZE;
79     if (parameterCount < PARSER_PARAM_SUM) {
80         MEDIA_ERR_LOG("GetObjectPropsSupportedData::parser paramCount=%{public}u, needCount=%{public}d",
81             parameterCount, PARSER_PARAM_SUM);
82         return MTP_INVALID_PARAMETER_CODE;
83     }
84 
85     size_t offset = MTP_CONTAINER_HEADER_SIZE;
86     context_->format = MtpPacketTool::GetUInt32(buffer, offset);
87     return MTP_SUCCESS;
88 }
89 
Maker(std::vector<uint8_t> & outBuffer)90 int GetObjectPropsSupportedData::Maker(std::vector<uint8_t> &outBuffer)
91 {
92     UInt16List properties;
93     GetObjectProps(properties);
94     MtpPacketTool::PutAUInt16(outBuffer, properties.data(), properties.size());
95     return MTP_SUCCESS;
96 }
97 
CalculateSize()98 uint32_t GetObjectPropsSupportedData::CalculateSize()
99 {
100     std::vector<uint8_t> tmpVar;
101     int res = Maker(tmpVar);
102     if (res != MTP_SUCCESS) {
103         return res;
104     }
105     return tmpVar.size();
106 }
107 
GetObjectProps(UInt16List & properties)108 void GetObjectPropsSupportedData::GetObjectProps(UInt16List &properties)
109 {
110     properties.assign(FILE_PROPERTIES.begin(), FILE_PROPERTIES.end());
111 
112     switch (context_->format) {
113         case MTP_FORMAT_EXIF_JPEG_CODE:
114         case MTP_FORMAT_GIF_CODE:
115         case MTP_FORMAT_PNG_CODE:
116         case MTP_FORMAT_BMP_CODE: {
117             properties.insert(properties.end(), IMAGE_PROPERTIES.begin(), IMAGE_PROPERTIES.end());
118             break;
119         }
120         case MTP_FORMAT_MP3_CODE:
121         case MTP_FORMAT_WAV_CODE:
122         case MTP_FORMAT_WMA_CODE:
123         case MTP_FORMAT_OGG_CODE:
124         case MTP_FORMAT_AAC_CODE: {
125             properties.insert(properties.end(), AUDIO_PROPERTIES.begin(), AUDIO_PROPERTIES.end());
126             break;
127         }
128         case MTP_FORMAT_MPEG_CODE:
129         case MTP_FORMAT_3GP_CONTAINER_CODE:
130         case MTP_FORMAT_WMV_CODE: {
131             properties.insert(properties.end(), VIDEO_PROPERTIES.begin(), VIDEO_PROPERTIES.end());
132             break;
133         }
134         default:
135             break;
136     }
137     return;
138 }
139 } // namespace Media
140 } // namespace OHOS