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