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 #ifndef OHOS_VCARD_DECODER_V21_H
17 #define OHOS_VCARD_DECODER_V21_H
18 
19 #include <memory>
20 #include <mutex>
21 #include <set>
22 
23 #include "vcard_decoder.h"
24 #include "vcard_raw_data.h"
25 
26 namespace OHOS {
27 namespace Telephony {
28 class VCardDecoderV21 : public VCardDecoder {
29 public:
30     ~VCardDecoderV21();
31     virtual void AddVCardDecodeListener(std::shared_ptr<VCardDecodeListener> listener);
32     virtual void Decode(int32_t &errorCode);
33     virtual bool DecodeOne(int32_t &errorCode);
34 
35 protected:
36     bool ReadBegin();
37     void ParseItems(int32_t &errorCode);
38     bool ParseItem(int32_t &errorCode);
39     void DealRawDataValue(const std::string &name, std::shared_ptr<VCardRawData> rawData, int32_t &errorCode);
40     virtual std::string GetVersion();
41     void RecordUnknowParamType(const std::string &name);
42     virtual std::string GetLine();
43     virtual std::string PeekLine();
44     virtual std::string GetNonEmptyLine();
45     void BuildRawData(const std::string &line, std::shared_ptr<VCardRawData> rawData, int32_t &errorCode);
46     virtual void DealParams(const std::string &params, std::shared_ptr<VCardRawData> rawData, int32_t &errorCode);
47     virtual void DealNoNameParam(
48         const std::string &paramValue, std::shared_ptr<VCardRawData> rawData, int32_t &errorCode);
49     virtual void DealTypeParam(const std::string &type, std::shared_ptr<VCardRawData> rawData, int32_t &errorCode);
50     void DealValueParam(const std::string &value, std::shared_ptr<VCardRawData> rawData, int32_t &errorCode);
51     void DealEncodingParam(const std::string &encoding, std::shared_ptr<VCardRawData> rawData, int32_t &errorCode);
52     void DealCharsetParam(const std::string &charset, std::shared_ptr<VCardRawData> rawData, int32_t &errorCode);
53     void DealLanguageParam(const std::string &language, std::shared_ptr<VCardRawData> rawData, int32_t &errorCode);
54     virtual void DealAnyParam(const std::string &param, const std::string &paramValue,
55         std::shared_ptr<VCardRawData> rawData, int32_t &errorCode);
56     virtual std::vector<std::string> GetSupportParamType();
57     virtual std::vector<std::string> GetSupportParamValue();
58     virtual std::vector<std::string> GetSupportType();
59     virtual std::vector<std::string> GetSupportParamEncoding();
60     void DealAdrOrgN(const std::string &rawValue, std::shared_ptr<VCardRawData> rawData, const std::string &fromCharSet,
61         const std::string &toCharSet, int32_t &errorCode);
62     void DealAgent(std::shared_ptr<VCardRawData> rawData, int32_t &errorCode);
63     virtual std::string GetBase64(const std::string &value, int32_t &errorCode);
64     virtual std::string UnescapeText(const std::string &from);
65     virtual std::string UnescapeChar(char ch);
66 
67 protected:
68     std::set<std::string> unknowParamType_;
69     std::set<std::string> unknowParamValue_;
70 
71 private:
72     void DealV21Value(std::string &rawValue);
73     void DealBase64OrB(const std::string &rawValue, std::shared_ptr<VCardRawData> rawData, int32_t &errorCode);
74     void DealEncodingQPOrNoEncodingFN(const std::string &rawValue, std::shared_ptr<VCardRawData> rawData,
75         const std::string &fromCharSet, const std::string &toCharSet, int32_t &errorCode);
76     void DealGroupOrTypeNameStatus(const std::string &line, std::shared_ptr<VCardRawData> rawData, int32_t &errorCode,
77         int32_t &status, int32_t &namePos, int32_t &index);
78     void DealParamsStatus(const std::string &line, std::shared_ptr<VCardRawData> rawData, int32_t &errorCode,
79         int32_t &status, int32_t &namePos, int32_t &index);
80     bool IsAllAscLetter(const std::string &value);
81     bool ContainValue(const std::string &value, const std::vector<std::string> values);
82     void ParseQuotedPrintableValues(const std::string &rawValue, std::vector<std::string> &encodedValues,
83         const std::string &fromCharSet, const std::string &toCharSet, int32_t &errorCode);
84     std::string ParseQuotedPrintableValue(
85         const std::string &from, const std::string &fromCharSet, const std::string &toCharSet, int32_t &errorCode);
86     std::string GetQuotedPrintableValue(const std::string &str, int32_t &errorCode);
87     std::string DecodeQuotedPrintable(const std::string &encodedString);
88     std::vector<std::string> BuildListFromValue(const std::string &value);
89     std::string GetPoMultiLine(const std::string &from);
90     std::string getUpperName(const std::string &from);
91     bool IsAscChar(char ch);
92     void NotifyStarted();
93     void NotifyEnded();
94     void NotifyOneContactStarted();
95     void NotifyOneContactEnded();
96     void NotifyRawDataCreated(std::shared_ptr<VCardRawData> rawData);
97 
98 private:
99     std::string currentEncoding_;
100     std::string currentCharset_;
101     std::vector<std::shared_ptr<VCardDecodeListener>> listeners_;
102 };
103 } // namespace Telephony
104 } // namespace OHOS
105 #endif // OHOS_VCARD_DECODER_V21_H
106