1 /*
2 * Copyright (c) 2023 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
16 #include "avcall_meta_data.h"
17 #include "avsession_log.h"
18
19 namespace OHOS::AVSession {
Marshalling(Parcel & parcel) const20 bool AVCallMetaData::Marshalling(Parcel& parcel) const
21 {
22 return parcel.WriteString(callMetaMask_.to_string()) &&
23 parcel.WriteString(name_) &&
24 parcel.WriteString(phoneNumber_) &&
25 parcel.WriteString(mediaImageUri_) &&
26 parcel.WriteParcelable(mediaImage_.get());
27 }
28
Unmarshalling(Parcel & data)29 AVCallMetaData *AVCallMetaData::Unmarshalling(Parcel& data)
30 {
31 std::string mask;
32 CHECK_AND_RETURN_RET_LOG(data.ReadString(mask) && mask.length() == AVCALL_META_KEY_MAX, nullptr, "mask not valid");
33 CHECK_AND_RETURN_RET_LOG(mask.find_first_not_of("01") == std::string::npos, nullptr, "mask string not 0 or 1");
34
35 auto *result = new (std::nothrow) AVCallMetaData();
36 CHECK_AND_RETURN_RET_LOG(result != nullptr, nullptr, "new AVCallMetaData failed");
37 result->callMetaMask_ = AVCallMetaMaskType(mask);
38 if (!data.ReadString(result->name_) ||
39 !data.ReadString(result->phoneNumber_) ||
40 !data.ReadString(result->mediaImageUri_)) {
41 SLOGE("read AVCallMetaData name phoneNumber or mediaImageUri failed.");
42 }
43 result->mediaImage_ = std::shared_ptr<AVSessionPixelMap>(data.ReadParcelable<AVSessionPixelMap>());
44 if (result->callMetaMask_.test(AVCALL_META_KEY_MEDIA_IMAGE) && result->mediaImage_ == nullptr) {
45 SLOGE("read PixelMap failed");
46 }
47 return result;
48 }
49
SetName(const std::string & name)50 void AVCallMetaData::SetName(const std::string& name)
51 {
52 name_ = name;
53 callMetaMask_.set(AVCALL_META_KEY_NAME);
54 }
55
GetName() const56 std::string AVCallMetaData::GetName() const
57 {
58 return name_;
59 }
60
SetPhoneNumber(const std::string & phoneNumber)61 void AVCallMetaData::SetPhoneNumber(const std::string& phoneNumber)
62 {
63 phoneNumber_ = phoneNumber;
64 callMetaMask_.set(AVCALL_META_KEY_PHONE_NUMBER);
65 }
66
GetPhoneNumber() const67 std::string AVCallMetaData::GetPhoneNumber() const
68 {
69 return phoneNumber_;
70 }
71
SetMediaImage(const std::shared_ptr<AVSessionPixelMap> & mediaImage)72 void AVCallMetaData::SetMediaImage(const std::shared_ptr<AVSessionPixelMap>& mediaImage)
73 {
74 mediaImage_ = mediaImage;
75 callMetaMask_.set(AVCALL_META_KEY_MEDIA_IMAGE);
76 }
77
GetMediaImage() const78 std::shared_ptr<AVSessionPixelMap> AVCallMetaData::GetMediaImage() const
79 {
80 return mediaImage_;
81 }
82
SetMediaImageUri(const std::string & mediaImageUri)83 void AVCallMetaData::SetMediaImageUri(const std::string& mediaImageUri)
84 {
85 mediaImageUri_ = mediaImageUri;
86 callMetaMask_.set(AVCALL_META_KEY_MEDIA_IMAGE_URI);
87 }
88
GetMediaImageUri() const89 std::string AVCallMetaData::GetMediaImageUri() const
90 {
91 return mediaImageUri_;
92 }
93
GetAVCallMetaMask() const94 AVCallMetaData::AVCallMetaMaskType AVCallMetaData::GetAVCallMetaMask() const
95 {
96 return callMetaMask_;
97 }
98
Reset()99 void AVCallMetaData::Reset()
100 {
101 callMetaMask_.reset();
102 name_ = "";
103 phoneNumber_ = "";
104 mediaImageUri_ = "";
105 mediaImage_ = nullptr;
106 }
107
CopyToByMask(AVCallMetaMaskType & mask,AVCallMetaData & metaOut) const108 bool AVCallMetaData::CopyToByMask(AVCallMetaMaskType& mask, AVCallMetaData& metaOut) const
109 {
110 bool result = false;
111 auto intersection = callMetaMask_ & mask;
112 for (int i = 0; i < AVCALL_META_KEY_MAX; i++) {
113 if (intersection.test(i)) {
114 cloneActions[i](*this, metaOut);
115 metaOut.callMetaMask_.set(i);
116 result = true;
117 }
118 }
119
120 return result;
121 }
122
CopyFrom(const AVCallMetaData & metaIn)123 bool AVCallMetaData::CopyFrom(const AVCallMetaData& metaIn)
124 {
125 if (metaIn.name_.empty() && metaIn.phoneNumber_.empty() &&
126 metaIn.mediaImageUri_.empty() && (metaIn.mediaImage_ == nullptr)) {
127 SLOGE("AVCallMetaData is empty");
128 return false;
129 }
130
131 if (metaIn.name_ != name_ && metaIn.phoneNumber_ != phoneNumber_ &&
132 (!metaIn.mediaImageUri_.empty() || (metaIn.mediaImage_ != nullptr))) {
133 SLOGD("AVCallMetaData not equal");
134 *this = metaIn;
135 return true;
136 }
137
138 bool result = false;
139 for (int i = 0; i < AVCALL_META_KEY_MAX; i++) {
140 if (metaIn.callMetaMask_.test(i)) {
141 cloneActions[i](metaIn, *this);
142 callMetaMask_.set(i);
143 result = true;
144 }
145 }
146
147 return result;
148 }
149
IsValid() const150 bool AVCallMetaData::IsValid() const
151 {
152 return phoneNumber_ != "" || name_ != "" || mediaImage_ != nullptr || mediaImageUri_ != "";
153 }
154
CloneName(const AVCallMetaData & from,AVCallMetaData & to)155 void AVCallMetaData::CloneName(const AVCallMetaData& from, AVCallMetaData& to)
156 {
157 to.name_ = from.name_;
158 }
159
ClonePhoneNumber(const AVCallMetaData & from,AVCallMetaData & to)160 void AVCallMetaData::ClonePhoneNumber(const AVCallMetaData& from, AVCallMetaData& to)
161 {
162 to.phoneNumber_ = from.phoneNumber_;
163 }
164
CloneMediaImage(const AVCallMetaData & from,AVCallMetaData & to)165 void AVCallMetaData::CloneMediaImage(const AVCallMetaData& from, AVCallMetaData& to)
166 {
167 to.mediaImage_ = from.mediaImage_;
168 }
169
CloneMediaImageUri(const AVCallMetaData & from,AVCallMetaData & to)170 void AVCallMetaData::CloneMediaImageUri(const AVCallMetaData& from, AVCallMetaData& to)
171 {
172 to.mediaImageUri_ = from.mediaImageUri_;
173 }
174 } // namespace OHOS::AVSession
175