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 #ifndef OHOS_AVCALL_META_DATA_H
16 #define OHOS_AVCALL_META_DATA_H
17 
18 #include <bitset>
19 #include <memory>
20 #include <string>
21 #include <map>
22 
23 #include "parcel.h"
24 #include "avsession_pixel_map.h"
25 
26 #ifndef WINDOWS_PLATFORM
27 #ifndef MAC_PLATFORM
28 #ifndef IOS_PLATFORM
29 #include <malloc.h>
30 #endif
31 #endif
32 #endif
33 
34 namespace OHOS::AVSession {
35 class AVCallMetaData : public Parcelable {
36 public:
37     enum {
38         AVCALL_META_KEY_NAME = 0,
39         AVCALL_META_KEY_PHONE_NUMBER = 1,
40         AVCALL_META_KEY_MEDIA_IMAGE = 2,
41         AVCALL_META_KEY_MEDIA_IMAGE_URI = 3,
42         AVCALL_META_KEY_MAX = 4
43     };
44 
45     using AVCallMetaMaskType = std::bitset<AVCALL_META_KEY_MAX>;
46 
47     AVCallMetaData() = default;
48     ~AVCallMetaData() = default;
49 
50     static AVCallMetaData* Unmarshalling(Parcel& data);
51     bool Marshalling(Parcel& parcel) const override;
52 
53     void SetName(const std::string& assetId);
54     std::string GetName() const;
55 
56     void SetPhoneNumber(const std::string& title);
57     std::string GetPhoneNumber() const;
58 
59     void SetMediaImage(const std::shared_ptr<AVSessionPixelMap>& mediaImage);
60     std::shared_ptr<AVSessionPixelMap> GetMediaImage() const;
61 
62     void SetMediaImageUri(const std::string& mediaImageUri);
63     std::string GetMediaImageUri() const;
64 
65     void Reset();
66 
67     AVCallMetaMaskType GetAVCallMetaMask() const;
68 
69     bool CopyToByMask(AVCallMetaMaskType& mask, AVCallMetaData& metaOut) const;
70     bool CopyFrom(const AVCallMetaData& metaIn);
71 
72     bool IsValid() const;
73 
74     const static inline std::vector<int32_t> localCapability {
75         AVCALL_META_KEY_NAME,
76         AVCALL_META_KEY_PHONE_NUMBER,
77         AVCALL_META_KEY_MEDIA_IMAGE,
78         AVCALL_META_KEY_MEDIA_IMAGE_URI
79     };
80 
81 private:
82     AVCallMetaMaskType callMetaMask_;
83 
84     std::string name_ = "";
85     std::string phoneNumber_ = "";
86     std::shared_ptr<AVSessionPixelMap> mediaImage_ = nullptr;
87     std::string mediaImageUri_ = "";
88 
89     static void CloneName(const AVCallMetaData& from, AVCallMetaData& to);
90     static void ClonePhoneNumber(const AVCallMetaData& from, AVCallMetaData& to);
91     static void CloneMediaImage(const AVCallMetaData& from, AVCallMetaData& to);
92     static void CloneMediaImageUri(const AVCallMetaData& from, AVCallMetaData& to);
93 
94     using CloneActionType = void(*)(const AVCallMetaData& from, AVCallMetaData& to);
95     static inline CloneActionType cloneActions[AVCALL_META_KEY_MAX] = {
96         &AVCallMetaData::CloneName,
97         &AVCallMetaData::ClonePhoneNumber,
98         &AVCallMetaData::CloneMediaImage,
99         &AVCallMetaData::CloneMediaImageUri
100     };
101 };
102 } // namespace OHOS::AVSession
103 #endif // OHOS_AVCALL_META_DATA_H
104