1 /*
2  * Copyright (C) 2021 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 "mms_header.h"
17 
18 #include <chrono>
19 #include <cinttypes>
20 #include <iostream>
21 #include <utility>
22 #include <random>
23 
24 #include "telephony_log_wrapper.h"
25 #include "mms_charset.h"
26 
27 namespace OHOS {
28 namespace Telephony {
29 using namespace std;
MmsHeader()30 MmsHeader::MmsHeader()
31 {
32     InitOctetHandleFun();
33     InitLongHandleFun();
34     InitStringHandleFun();
35     InitTextStringHandleFun();
36 }
37 
InitOctetHandleFun()38 void MmsHeader::InitOctetHandleFun()
39 {
40     auto func = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
41         return DecodeFieldOctetValue(fieldId, buff, len);
42     };
43     memberFuncMap_[MMS_DELIVERY_REPORT] = func; // MmsBoolType
44     memberFuncMap_[MMS_READ_REPORT] = func;
45     memberFuncMap_[MMS_REPORT_ALLOWED] = func;
46     memberFuncMap_[MMS_STORE] = func;
47     memberFuncMap_[MMS_STORED] = func;
48     memberFuncMap_[MMS_TOTALS] = func;
49     memberFuncMap_[MMS_QUOTAS] = func;
50     memberFuncMap_[MMS_DISTRIBUTION_INDICATOR] = func;
51     memberFuncMap_[MMS_ADAPTATION_ALLOWED] = func;
52     memberFuncMap_[MMS_MESSAGE_CLASS] = func;
53     memberFuncMap_[MMS_PRIORITY] = func; // MmsPriority
54     memberFuncMap_[MMS_RESPONSE_STATUS] = func; // MmsResponseStatus
55     memberFuncMap_[MMS_SENDER_VISIBILITY] = func; // MmsSenderVisibilityType
56     memberFuncMap_[MMS_STATUS] = func; // MmsStatus
57     memberFuncMap_[MMS_RETRIEVE_STATUS] = func; // MmsRetrieveStatus
58     memberFuncMap_[MMS_READ_STATUS] = func; // MmsReadStatus
59     memberFuncMap_[MMS_REPLY_CHARGING] = func; // MmsReplyCharging
60     memberFuncMap_[MMS_MM_STATE] = func; // MmsMmState
61     memberFuncMap_[MMS_MM_FLAGS] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
62         return DecodeFieldMMFlag(fieldId, buff, len);
63     }; // MmsMmFlags
64     memberFuncMap_[MMS_STORE_STATUS] = func; // MmsStoreStatus
65     memberFuncMap_[MMS_MBOX_TOTALS] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
66         return DecodeFieldMBox(fieldId, buff, len);
67     }; // MmsMboxTotals
68     memberFuncMap_[MMS_MBOX_QUOTAS] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
69         return DecodeFieldMBox(fieldId, buff, len);
70     }; // MmsMboxQuotas
71     memberFuncMap_[MMS_RECOMMENDED_RETRIEVAL_MODE] = func; // MmsRecommendedRetrievalMode
72     memberFuncMap_[MMS_CONTENT_CLASS] = func; // MmsContentClass
73     memberFuncMap_[MMS_CANCEL_STATUS] = func; // MmsCancelStatus
74     memberFuncMap_[MMS_MESSAGE_TYPE] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
75         return DecodeMmsMsgType(fieldId, buff, len);
76     };
77     memberFuncMap_[MMS_ATTRIBUTES] = func;
78     memberFuncMap_[MMS_DRM_CONTENT] = func;
79 }
80 
InitLongHandleFun()81 void MmsHeader::InitLongHandleFun()
82 {
83     memberFuncMap_[MMS_CONTENT_TYPE] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
84         return DecodeMmsContentType(fieldId, buff, len);
85     };
86     memberFuncMap_[MMS_ELEMENT_DESCRIPTOR] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
87         return DecodeMmsContentType(fieldId, buff, len);
88     };
89     memberFuncMap_[MMS_DATE] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
90         return DecodeFieldLongValue(fieldId, buff, len);
91     };
92     memberFuncMap_[MMS_REPLY_CHARGING_SIZE] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
93         return DecodeFieldLongValue(fieldId, buff, len);
94     };
95     memberFuncMap_[MMS_MESSAGE_SIZE] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
96         return DecodeFieldLongValue(fieldId, buff, len);
97     };
98 
99     memberFuncMap_[MMS_MESSAGE_COUNT] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
100         return DecodeFieldIntegerValue(fieldId, buff, len);
101     };
102     memberFuncMap_[MMS_START] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
103         return DecodeFieldIntegerValue(fieldId, buff, len);
104     };
105     memberFuncMap_[MMS_LIMIT] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
106         return DecodeFieldIntegerValue(fieldId, buff, len);
107     };
108     memberFuncMap_[MMS_MMS_VERSION] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
109         return DecodeFieldIntegerValue(fieldId, buff, len);
110     };
111 
112     memberFuncMap_[MMS_DELIVERY_TIME] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
113         return DecodeFieldDate(fieldId, buff, len);
114     };
115     memberFuncMap_[MMS_EXPIRY] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
116         return DecodeFieldDate(fieldId, buff, len);
117     };
118     memberFuncMap_[MMS_REPLY_CHARGING_DEADLINE] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
119         return DecodeFieldDate(fieldId, buff, len);
120     }; // MmsReplyChargingDeadline
121     memberFuncMap_[MMS_PREVIOUSLY_SENT_DATE] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
122         return DecodeFieldPreviouslySentDate(fieldId, buff, len);
123     };
124 }
125 
InitStringHandleFun()126 void MmsHeader::InitStringHandleFun()
127 {
128     auto func = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
129         return DecodeFieldEncodedStringValue(fieldId, buff, len);
130     };
131     memberFuncMap_[MMS_RESPONSE_TEXT] = func;
132     memberFuncMap_[MMS_SUBJECT] = func;
133     memberFuncMap_[MMS_RETRIEVE_TEXT] = func;
134     memberFuncMap_[MMS_PREVIOUSLY_SENT_BY] = func;
135 
136     memberFuncMap_[MMS_STORE_STATUS_TEXT] = func;
137     memberFuncMap_[MMS_RECOMMENDED_RETRIEVAL_MODE_TEXT] = func;
138     memberFuncMap_[MMS_STATUS_TEXT] = func;
139 
140     memberFuncMap_[MMS_BCC] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
141         return DecodeFieldAddressModelValue(fieldId, buff, len);
142     };
143     memberFuncMap_[MMS_CC] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
144         return DecodeFieldAddressModelValue(fieldId, buff, len);
145     };
146     memberFuncMap_[MMS_TO] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
147         return DecodeFieldAddressModelValue(fieldId, buff, len);
148     };
149 
150     memberFuncMap_[MMS_FROM] = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
151         return DecodeFromValue(fieldId, buff, len);
152     };
153 }
154 
InitTextStringHandleFun()155 void MmsHeader::InitTextStringHandleFun()
156 {
157     auto func = [this](uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len) {
158         return DecodeFieldTextStringValue(fieldId, buff, len);
159     };
160     memberFuncMap_[MMS_CONTENT_LOCATION] = func;
161     memberFuncMap_[MMS_TRANSACTION_ID] = func;
162     memberFuncMap_[MMS_MESSAGE_ID] = func;
163     memberFuncMap_[MMS_REPLACE_ID] = func;
164     memberFuncMap_[MMS_CANCEL_ID] = func;
165     memberFuncMap_[MMS_APPLIC_ID] = func;
166     memberFuncMap_[MMS_REPLY_APPLIC_ID] = func;
167     memberFuncMap_[MMS_REPLY_CHARGING_ID] = func;
168     memberFuncMap_[MMS_AUX_APPLIC_INFO] = func;
169 }
170 
DumpMmsHeader()171 void MmsHeader::DumpMmsHeader()
172 {
173     bool find = false;
174     std::string fieldName;
175     for (auto it = octetValueMap_.begin(); it != octetValueMap_.end(); it++) {
176         find = FindHeaderFieldName(it->first, fieldName);
177         TELEPHONY_LOGI("%{private}s : 0x%{private}02X", find ? fieldName.c_str() : "unkown field", it->second);
178     }
179 
180     for (auto it = longValueMap_.begin(); it != longValueMap_.end(); it++) {
181         find = FindHeaderFieldName(it->first, fieldName);
182         TELEPHONY_LOGI("%{private}s : %{private}" PRId64 "", find ? fieldName.c_str() : "unkown field", it->second);
183     }
184 
185     for (auto it = textValueMap_.begin(); it != textValueMap_.end(); it++) {
186         find = FindHeaderFieldName(it->first, fieldName);
187         TELEPHONY_LOGI("%{private}s : %{private}s", find ? fieldName.c_str() : "unkown field", it->second.c_str());
188     }
189 
190     for (auto it = encodeStringsMap_.begin(); it != encodeStringsMap_.end(); it++) {
191         find = FindHeaderFieldName(it->first, fieldName);
192         std::string enString;
193         if (find) {
194             it->second.GetEncodeString(enString);
195         }
196         TELEPHONY_LOGI("%{private}s : %{private}s", find ? fieldName.c_str() : "unkown field", enString.c_str());
197     }
198 
199     for (auto it = addressMap_.begin(); it != addressMap_.end(); it++) {
200         find = FindHeaderFieldName(it->first, fieldName);
201         std::vector<MmsAddress> address = it->second;
202         for (auto itAddress : address) {
203             std::string enString = itAddress.GetAddressString();
204             TELEPHONY_LOGI("%{private}s : %{private}s", find ? fieldName.c_str() : "unkown field", enString.c_str());
205         }
206     }
207 }
208 
DecodeMmsHeader(MmsDecodeBuffer &decodeBuffer)209 bool MmsHeader::DecodeMmsHeader(MmsDecodeBuffer &decodeBuffer)
210 {
211     const uint8_t setHighestBitOne = 0x80;
212     uint8_t fieldCode = 0xff;
213     uint8_t oneByte = 0;
214     int32_t len = 0;
215     while (decodeBuffer.GetOneByte(oneByte)) {
216         fieldCode = (oneByte | setHighestBitOne);
217         auto decodeFunc = memberFuncMap_.find(fieldCode);
218         if (decodeFunc != memberFuncMap_.end()) {
219             auto fun = decodeFunc->second;
220             if (fun != nullptr && !fun(fieldCode, decodeBuffer, len)) {
221                 TELEPHONY_LOGE("The fieldId[%{public}d] decode header fail.", fieldCode);
222                 return false;
223             }
224             if (fieldCode == MMS_CONTENT_TYPE) {
225                 break;
226             }
227         } else {
228             TELEPHONY_LOGI("DecodeMmsMsgUnKnownField:%{public}02X", fieldCode);
229             DecodeMmsMsgUnKnownField(decodeBuffer);
230         }
231     }
232     return true;
233 }
234 
EncodeMmsHeader(MmsEncodeBuffer &encodeBuffer)235 bool MmsHeader::EncodeMmsHeader(MmsEncodeBuffer &encodeBuffer)
236 {
237     uint8_t messageType = 0;
238     const uint8_t defTranScactionIdLen = 24;
239     const int64_t defVersion = static_cast<int64_t>(MmsVersionType::MMS_VERSION_1_3);
240     if (!GetOctetValue(MMS_MESSAGE_TYPE, messageType)) {
241         TELEPHONY_LOGE("Not Set Mms Message Type Error.");
242         return false;
243     }
244 
245     std::string transactionId = "";
246     if (!GetStringValue(MMS_TRANSACTION_ID, transactionId) && IsHaveTransactionId(messageType)) {
247         SetTextValue(MMS_TRANSACTION_ID, MakeTransactionId(defTranScactionIdLen));
248     }
249 
250     int64_t mmsVersion = 0;
251     if (!GetLongValue(MMS_MMS_VERSION, mmsVersion)) {
252         mmsVersion = defVersion;
253         SetLongValue(MMS_MMS_VERSION, mmsVersion);
254     }
255     if (mmsVersion < static_cast<int64_t>(MmsVersionType::MMS_VERSION_1_0) ||
256         mmsVersion > static_cast<int64_t>(MmsVersionType::MMS_VERSION_1_3)) {
257         SetLongValue(MMS_MMS_VERSION, defVersion);
258     }
259 
260     if (!EncodeCommontFieldValue(encodeBuffer)) {
261         TELEPHONY_LOGE("Encode Commont Header Field Err.");
262         return false;
263     }
264     switch (messageType) {
265         case MMS_MSGTYPE_SEND_REQ:
266             return EncodeMmsSendReq(encodeBuffer);
267         case MMS_MSGTYPE_SEND_CONF:
268             return EncodeMmsSendConf(encodeBuffer);
269         case MMS_MSGTYPE_NOTIFICATION_IND:
270             return EncodeMmsNotificationInd(encodeBuffer);
271         case MMS_MSGTYPE_NOTIFYRESP_IND:
272             return EnocdeMmsNotifyRespInd(encodeBuffer);
273         case MMS_MSGTYPE_RETRIEVE_CONF:
274             return EnocdeMmsRetrieveConf(encodeBuffer);
275         case MMS_MSGTYPE_ACKNOWLEDGE_IND:
276             return EnocdeMmsAcknowledgeInd(encodeBuffer);
277         case MMS_MSGTYPE_DELIVERY_IND:
278             return EnocdeMmsDeliveryInd(encodeBuffer);
279         case MMS_MSGTYPE_READ_REC_IND:
280             return EncodeMmsReadRecInd(encodeBuffer);
281         case MMS_MSGTYPE_READ_ORIG_IND:
282             return EncodeMmsReadOrigInd(encodeBuffer);
283         default:
284             TELEPHONY_LOGE("Mms Message Type unSupported Err.");
285             return false;
286     }
287 }
288 
GetOctetValue(uint8_t fieldId, uint8_t &value) const289 bool MmsHeader::GetOctetValue(uint8_t fieldId, uint8_t &value) const
290 {
291     value = 0;
292     auto it = octetValueMap_.find(fieldId);
293     if (it != octetValueMap_.end()) {
294         value = it->second;
295         return true;
296     }
297     return false;
298 }
299 
SetOctetValue(uint8_t fieldId, uint8_t value)300 bool MmsHeader::SetOctetValue(uint8_t fieldId, uint8_t value)
301 {
302     if (mmsHaderCateg_.FindFieldDes(fieldId) != MmsFieldValueType::MMS_FIELD_OCTET_TYPE) {
303         TELEPHONY_LOGE("The fieldId[%{public}02X] is not belong to octet.", fieldId);
304         return false;
305     }
306     if (CheckBooleanValue(fieldId, value)) {
307         return true;
308     }
309     bool match = false;
310     if (!SetOctetValuePartData(fieldId, value, match)) {
311         TELEPHONY_LOGE("The fieldId[%{public}02X] value invalid.", fieldId);
312         return false;
313     }
314 
315     switch (fieldId) {
316         case MMS_CONTENT_CLASS:
317             if (value < static_cast<uint8_t>(MmsContentClass::MMS_TEXT) ||
318                 value > static_cast<uint8_t>(MmsContentClass::MMS_CONTENT_RICH)) {
319                 TELEPHONY_LOGE("The MMS_CONTENT_CLASS value invalid.");
320                 return false;
321             }
322             break;
323         case MMS_CANCEL_STATUS:
324             if (value < static_cast<uint8_t>(MmsCancelStatus::MMS_CANCEL_REQUEST_SUCCESSFULLY_RECEIVED) ||
325                 value > static_cast<uint8_t>(MmsCancelStatus::MMS_CANCEL_REQUEST_CORRUPTED)) {
326                 TELEPHONY_LOGE("The MMS_CANCEL_STATUS value invalid.");
327                 return false;
328             }
329             break;
330         case MMS_MESSAGE_CLASS:
331             if (value < static_cast<uint8_t>(MmsMessageClass::PERSONAL) ||
332                 value > static_cast<uint8_t>(MmsMessageClass::AUTO)) {
333                 TELEPHONY_LOGE("The MMS_MESSAGE_CLASS value invalid.");
334                 return false;
335             }
336             break;
337         default:
338             if (!match) {
339                 TELEPHONY_LOGE("The 111fieldId[%{public}02X] value invalid.", fieldId);
340                 return false;
341             }
342     }
343     auto ret = octetValueMap_.emplace(fieldId, value);
344     return ret.second;
345 }
346 
SetOctetValuePartData(uint8_t fieldId, uint8_t value, bool &match)347 bool MmsHeader::SetOctetValuePartData(uint8_t fieldId, uint8_t value, bool &match)
348 {
349     if (!SetOctetValuePortionData(fieldId, value, match)) {
350         return false;
351     }
352     if (match) {
353         return match;
354     }
355     switch (fieldId) {
356         case MMS_READ_STATUS:
357             if (value < static_cast<uint8_t>(MmsReadStatus::MMS_READ) ||
358                 value > static_cast<uint8_t>(MmsReadStatus::MMS_DELETED_WITHOUT_BEING_READ)) {
359                 TELEPHONY_LOGE("The MMS_READ_STATUS value invalid.");
360                 return false;
361             }
362             break;
363         case MMS_REPLY_CHARGING:
364             if (value < static_cast<uint8_t>(MmsReplyCharging::MMS_REQUESTED) ||
365                 value > static_cast<uint8_t>(MmsReplyCharging::MMS_ACCEPTED_TEXT_ONLY)) {
366                 TELEPHONY_LOGE("The MMS_REPLY_CHARGING value invalid.");
367                 return false;
368             }
369             break;
370         case MMS_MM_STATE:
371             if (value < static_cast<uint8_t>(MmsMmState::MMS_MM_STATE_DRAFT) ||
372                 value > static_cast<uint8_t>(MmsMmState::MMS_MM_STATE_FORWARDED)) {
373                 TELEPHONY_LOGE("The MMS_MM_STATE value invalid.");
374                 return false;
375             }
376             break;
377         case MMS_MM_FLAGS:
378             if (value < static_cast<uint8_t>(MmsMmFlags::MMS_ADD_TOKEN) ||
379                 value > static_cast<uint8_t>(MmsMmFlags::MMS_FILTER_TOKEN)) {
380                 TELEPHONY_LOGE("The MMS_MM_FLAGS value invalid.");
381                 return false;
382             }
383             break;
384         case MMS_STORE_STATUS:
385             if (!CheckStoreStatus(value)) {
386                 TELEPHONY_LOGE("The MMS_STORE_STATUS value invalid.");
387                 return false;
388             }
389             break;
390         default:
391             match = false;
392             return true;
393     }
394     return true;
395 }
396 
SetOctetValuePortionData(uint8_t fieldId, uint8_t value, bool &match)397 bool MmsHeader::SetOctetValuePortionData(uint8_t fieldId, uint8_t value, bool &match)
398 {
399     match = true;
400     switch (fieldId) {
401         case MMS_MESSAGE_TYPE:
402             if (value < static_cast<uint8_t>(MmsMsgType::MMS_MSGTYPE_SEND_REQ) ||
403                 value > static_cast<uint8_t>(MmsMsgType::MMS_MSGTYPE_FORWARD_CONF)) {
404                 TELEPHONY_LOGE("The MMS_MESSAGE_TYPE value invalid.");
405                 return false;
406             }
407             break;
408         case MMS_PRIORITY:
409             if (value < static_cast<uint8_t>(MmsPriority::MMS_LOW) ||
410                 value > static_cast<uint8_t>(MmsPriority::MMS_HIGH)) {
411                 TELEPHONY_LOGE("The MMS_PRIORITY value invalid.");
412                 return false;
413             }
414             break;
415         case MMS_RESPONSE_STATUS:
416             if (!CheckResponseStatus(value)) {
417                 TELEPHONY_LOGE("The MMS_RESPONSE_STATUS value invalid.");
418                 return false;
419             }
420             break;
421         case MMS_SENDER_VISIBILITY:
422             if (value < static_cast<uint8_t>(MmsSenderVisibility::MMS_HIDE) ||
423                 value > static_cast<uint8_t>(MmsSenderVisibility::MMS_SHOW)) {
424                 TELEPHONY_LOGE("The MMS_SENDER_VISIBILITY value invalid.");
425                 return false;
426             }
427             break;
428         case MMS_STATUS:
429             if (value < static_cast<uint8_t>(MmsStatus::MMS_EXPIRED) ||
430                 value > static_cast<uint8_t>(MmsStatus::MMS_UNREACHABLE)) {
431                 TELEPHONY_LOGE("The MMS_STATUS value invalid.");
432                 return false;
433             }
434             break;
435         case MMS_RETRIEVE_STATUS:
436             if (!CheckRetrieveStatus(value)) {
437                 TELEPHONY_LOGE("The MMS_RETRIEVE_STATUS value invalid.");
438                 return false;
439             }
440             break;
441         default:
442             match = false;
443             return true;
444     }
445     return true;
446 }
447 
GetLongValue(uint8_t fieldId, int64_t &value) const448 bool MmsHeader::GetLongValue(uint8_t fieldId, int64_t &value) const
449 {
450     value = 0;
451     auto it = longValueMap_.find(fieldId);
452     if (it != longValueMap_.end()) {
453         value = it->second;
454         return true;
455     }
456     return false;
457 }
458 
SetLongValue(uint8_t fieldId, int64_t value)459 bool MmsHeader::SetLongValue(uint8_t fieldId, int64_t value)
460 {
461     if (mmsHaderCateg_.FindFieldDes(fieldId) != MmsFieldValueType::MMS_FIELD_INTEGER_TYPE &&
462         mmsHaderCateg_.FindFieldDes(fieldId) != MmsFieldValueType::MMS_FIELD_LONG_TYPE) {
463         TELEPHONY_LOGE("The fieldId[%{public}02X] value is not belong to LongValue.", fieldId);
464         return false;
465     }
466     auto ret = longValueMap_.emplace(fieldId, value);
467     return ret.second;
468 }
469 
GetTextValue(uint8_t fieldId, std::string &value) const470 bool MmsHeader::GetTextValue(uint8_t fieldId, std::string &value) const
471 {
472     value.clear();
473     auto it = textValueMap_.find(fieldId);
474     if (it != textValueMap_.end()) {
475         value.assign(it->second);
476         return true;
477     }
478     return false;
479 }
480 
SetTextValue(uint8_t fieldId, std::string value)481 bool MmsHeader::SetTextValue(uint8_t fieldId, std::string value)
482 {
483     if (value.empty()) {
484         TELEPHONY_LOGE("fieldId[%{public}d] The Value Is Empty Error.", fieldId);
485         return false;
486     }
487     if (mmsHaderCateg_.FindFieldDes(fieldId) != MmsFieldValueType::MMS_FIELD_TEXT_TYPE) {
488         TELEPHONY_LOGE("The fieldId[%{public}02X] value is not belong to TextValue.", fieldId);
489         return false;
490     }
491     auto ret = textValueMap_.emplace(fieldId, value);
492     return ret.second;
493 }
494 
GetEncodeStringValue(uint8_t fieldId, MmsEncodeString &value) const495 bool MmsHeader::GetEncodeStringValue(uint8_t fieldId, MmsEncodeString &value) const
496 {
497     auto it = encodeStringsMap_.find(fieldId);
498     if (it != encodeStringsMap_.end()) {
499         value = it->second;
500         return true;
501     }
502     return false;
503 }
504 
SetEncodeStringValue(uint8_t fieldId, uint32_t charset, const std::string &value)505 bool MmsHeader::SetEncodeStringValue(uint8_t fieldId, uint32_t charset, const std::string &value)
506 {
507     if (value.empty()) {
508         TELEPHONY_LOGE("fieldId[%{public}d] The Value Is Empty Error.", fieldId);
509         return false;
510     }
511     if (mmsHaderCateg_.FindFieldDes(fieldId) != MmsFieldValueType::MMS_FIELD_ENCODE_TEXT_TYPE) {
512         TELEPHONY_LOGE("The fieldId[%{public}02X] value is not belong to EncodeString.", fieldId);
513         return false;
514     }
515     MmsEncodeString encodeString;
516     if (!encodeString.SetEncodeString(charset, value)) {
517         TELEPHONY_LOGE("MmsHeader SetEncodeString fail.");
518         return false;
519     }
520     auto ret = encodeStringsMap_.emplace(fieldId, encodeString);
521     return ret.second;
522 }
523 
AddHeaderAddressValue(uint8_t fieldId, MmsAddress &address)524 bool MmsHeader::AddHeaderAddressValue(uint8_t fieldId, MmsAddress &address)
525 {
526     std::string strAddress = address.GetAddressString();
527     if (strAddress.empty() && fieldId != MMS_FROM) {
528         TELEPHONY_LOGE("Address is empty error.");
529         return false;
530     }
531     if (mmsHaderCateg_.FindFieldDes(fieldId) != MmsFieldValueType::MMS_FIELD_ENCODE_ADDR_TYPE) {
532         TELEPHONY_LOGE("The fieldId[%{public}02X] value is not belong to EncodeString.", fieldId);
533         return false;
534     }
535     auto it = addressMap_.find(fieldId);
536     if (it != addressMap_.end()) {
537         it->second.push_back(address);
538         return true;
539     } else {
540         std::vector<MmsAddress> addressValue;
541         addressValue.push_back(address);
542         auto ret = addressMap_.emplace(fieldId, addressValue);
543         return ret.second;
544     }
545 }
546 
GetHeaderAllAddressValue(uint8_t fieldId, std::vector<MmsAddress> &addressValue)547 bool MmsHeader::GetHeaderAllAddressValue(uint8_t fieldId, std::vector<MmsAddress> &addressValue)
548 {
549     addressValue.clear();
550     auto it = addressMap_.find(fieldId);
551     if (it != addressMap_.end()) {
552         addressValue.assign(it->second.begin(), it->second.end());
553         return true;
554     }
555     return false;
556 }
557 
GetStringValue(uint8_t fieldId, std::string &value) const558 bool MmsHeader::GetStringValue(uint8_t fieldId, std::string &value) const
559 {
560     if (GetTextValue(fieldId, value)) {
561         return true;
562     } else {
563         value.clear();
564         MmsEncodeString eValue;
565         if (!GetEncodeStringValue(fieldId, eValue)) {
566             TELEPHONY_LOGE("The fieldId[%{public}d] GetEncodeStringValue fail.", fieldId);
567             return false;
568         }
569         eValue.GetEncodeString(value);
570     }
571     return true;
572 }
573 
GetHeaderContentType()574 MmsContentType &MmsHeader::GetHeaderContentType()
575 {
576     return mmsContentType_;
577 }
578 
FindHeaderFieldName(const uint8_t fieldId, std::string &fieldName)579 bool MmsHeader::FindHeaderFieldName(const uint8_t fieldId, std::string &fieldName)
580 {
581     for (unsigned int i = 0; i < sizeof(mmsHeaderNames) / sizeof(mmsHeaderNames[0]); i++) {
582         if (fieldId == mmsHeaderNames[i].key) {
583             fieldName.clear();
584             fieldName.append(mmsHeaderNames[i].value);
585             return true;
586         }
587     }
588     return false;
589 }
590 
DecodeMmsMsgType(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)591 bool MmsHeader::DecodeMmsMsgType(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)
592 {
593     std::string fieldName;
594     if (!FindHeaderFieldName(fieldId, fieldName)) {
595         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader FindHeaderFieldName fail.", fieldId);
596         return false;
597     }
598 
599     uint8_t oneByte = 0;
600     if (!buff.GetOneByte(oneByte)) {
601         TELEPHONY_LOGE("MmsHeader GetOneByte fail.");
602         return false;
603     }
604     if (oneByte < MMS_MSGTYPE_SEND_REQ || oneByte > MMS_MSGTYPE_CANCEL_CONF) {
605         TELEPHONY_LOGE("MmsHeader message type not support.");
606         return false;
607     }
608     octetValueMap_.emplace(fieldId, oneByte);
609     return true;
610 }
611 
612 /**
613  * @brief DecodeFieldAddressModelValue
614  * OMA-TS-MMS_ENC-V1_3-20110913-A   section:7.3.21 From Field
615  * From-value = Value-length (Address-present-token Encoded-string-value | Insert-address-token)
616  * Address-present-token = <Octet 128>
617  * Insert-address-token = <Octet 129>
618  * @param fieldId
619  * @param buff
620  * @param len
621  * @return true
622  * @return false
623  */
DecodeFieldAddressModelValue(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)624 bool MmsHeader::DecodeFieldAddressModelValue(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)
625 {
626     std::string fieldName;
627     if (!FindHeaderFieldName(fieldId, fieldName)) {
628         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader FindHeaderFieldName fail.", fieldId);
629         return false;
630     }
631 
632     MmsEncodeString encodeString;
633     encodeString.DecodeEncodeString(buff);
634 
635     std::string encodeAddress;
636     encodeString.GetEncodeString(encodeAddress);
637     MmsAddress address(encodeAddress);
638 
639     std::vector<MmsAddress> vecAddress;
640     auto it = addressMap_.find(fieldId);
641     if (it != addressMap_.end()) {
642         vecAddress = it->second;
643         it->second.push_back(address);
644     } else {
645         vecAddress.push_back(address);
646         addressMap_.emplace(fieldId, vecAddress);
647     }
648     return true;
649 }
650 
DecodeFieldOctetValue(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)651 bool MmsHeader::DecodeFieldOctetValue(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)
652 {
653     std::string fieldName;
654     if (!FindHeaderFieldName(fieldId, fieldName)) {
655         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader FindHeaderFieldName fail.", fieldId);
656         return false;
657     }
658     uint8_t oneByte = 0;
659     if (!buff.GetOneByte(oneByte)) {
660         TELEPHONY_LOGE("MmsHeader GetOneByte fail.");
661         return false;
662     }
663     octetValueMap_.emplace(fieldId, oneByte);
664     return true;
665 }
666 
DecodeFieldLongValue(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)667 bool MmsHeader::DecodeFieldLongValue(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)
668 {
669     std::string fieldName;
670     if (!FindHeaderFieldName(fieldId, fieldName)) {
671         TELEPHONY_LOGE("MmsHeader FindHeaderFieldName fail.");
672         return false;
673     }
674 
675     uint64_t value = 0;
676     if (!buff.DecodeLongInteger(value)) {
677         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader DecodeLongInteger fail.", fieldId);
678         return false;
679     }
680     auto ret = longValueMap_.emplace(fieldId, value);
681     return ret.second;
682 }
683 
MakeTransactionId(uint32_t len)684 std::string MmsHeader::MakeTransactionId(uint32_t len)
685 {
686     const uint32_t englishLettersNum = 25;
687     const uint32_t digitalNum = 9;
688     const uint32_t typeNum = 2;
689 
690     std::default_random_engine e;
691     std::string transactionId = "";
692     std::uniform_int_distribution<unsigned> typeNumRandom(0, typeNum);
693     std::uniform_int_distribution<unsigned> digitalNumRandom(0, digitalNum);
694     std::uniform_int_distribution<unsigned> englishLettersNumRandom(0, englishLettersNum);
695     for (uint16_t i = 0; i < len; i++) {
696         switch (typeNumRandom(e)) {
697             case 0:
698                 transactionId += 'A' + (englishLettersNumRandom(e));
699                 break;
700             case 1:
701                 transactionId += '0' + (digitalNumRandom(e));
702                 break;
703             default:
704                 transactionId += 'a' + (englishLettersNumRandom(e));
705         }
706     }
707     return transactionId;
708 }
709 
DecodeFieldTextStringValue(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)710 bool MmsHeader::DecodeFieldTextStringValue(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)
711 {
712     std::string fieldName;
713     if (!FindHeaderFieldName(fieldId, fieldName)) {
714         TELEPHONY_LOGE("MmsHeader FindHeaderFieldName fail.");
715         return false;
716     }
717 
718     std::string tempString;
719     uint32_t tempLen = 0;
720     if (!buff.DecodeText(tempString, tempLen)) {
721         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader DecodeText fail.", fieldId);
722         return false;
723     }
724 
725     len = (int32_t)tempLen;
726     textValueMap_.emplace(fieldId, tempString);
727     return true;
728 }
729 
DecodeFieldEncodedStringValue(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)730 bool MmsHeader::DecodeFieldEncodedStringValue(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)
731 {
732     std::string fieldName;
733     if (!FindHeaderFieldName(fieldId, fieldName)) {
734         TELEPHONY_LOGE("MmsHeader FindHeaderFieldName fail.");
735         return false;
736     }
737 
738     MmsEncodeString encodeString;
739     if (!encodeString.DecodeEncodeString(buff)) {
740         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader DecodeEncodeString fail.", fieldId);
741         return false;
742     }
743     encodeStringsMap_.emplace(fieldId, encodeString);
744     return true;
745 }
746 
747 /**
748  * @brief DecodeFromValue
749  * OMA-TS-MMS_ENC-V1_3-20110913-A   section:7.3.21 From Field
750  * From-value = Value-length (Address-present-token Encoded-string-value | Insert-address-token)
751  * Address-present-token = <Octet 128>
752  * Insert-address-token = <Octet 129>
753  * @param fieldId
754  * @param buff
755  * @param len
756  * @return true
757  * @return false
758  */
DecodeFromValue(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)759 bool MmsHeader::DecodeFromValue(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)
760 {
761     // Value-length (Address-present-token Encoded-string-value | Insert-address-token)
762     const int addressPresentToken = 128;
763     const int insertAddressToken = 129;
764     std::string fieldName;
765     if (!FindHeaderFieldName(fieldId, fieldName)) {
766         TELEPHONY_LOGE("MmsHeader FindHeaderFieldName fail.");
767         return false;
768     }
769 
770     uint32_t valueLength = 0;
771     if (!buff.DecodeValueLength(valueLength)) {
772         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader DecodeValueLength fail.", fieldId);
773         return false;
774     }
775 
776     uint8_t oneByte = 0;
777     if (!buff.GetOneByte(oneByte)) {
778         TELEPHONY_LOGE("MmsHeader GetOneByte fail.");
779         return false;
780     }
781 
782     if (oneByte == addressPresentToken) {
783         // Address-present-token
784         MmsEncodeString encodeString;
785         encodeString.DecodeEncodeString(buff);
786 
787         std::string encodeAddress;
788         encodeString.GetEncodeString(encodeAddress);
789         if (encodeAddress.empty()) {
790             encodeAddress = encodeString.GetStrEncodeString();
791         }
792         MmsAddress address(encodeAddress);
793 
794         std::vector<MmsAddress> vecAddress;
795         vecAddress.push_back(address);
796         addressMap_.emplace(fieldId, vecAddress);
797         return true;
798     } else if (oneByte == insertAddressToken) {
799         // Insert-address-token
800         MmsAddress address("Insert-address-token");
801         std::vector<MmsAddress> vecAddress;
802         vecAddress.push_back(address);
803         addressMap_.emplace(fieldId, vecAddress);
804         return true;
805     }
806     return false;
807 }
808 
GetSmilFileName(std::string &smileFileName)809 bool MmsHeader::GetSmilFileName(std::string &smileFileName)
810 {
811     smileFileName = "";
812     const uint8_t startValue = static_cast<uint8_t>(ContentParam::CT_P_START_VALUE);
813     const uint8_t paramStart = static_cast<uint8_t>(ContentParam::CT_P_START);
814     uint8_t fieldIds[] = {startValue, paramStart};
815 
816     for (unsigned int i = 0; i < sizeof(fieldIds); i++) {
817         auto start = mmsContentType_.GetContentParam().GetParamMap().find(fieldIds[i]);
818         if (start != mmsContentType_.GetContentParam().GetParamMap().end()) {
819             smileFileName = start->second;
820             return true;
821         }
822     }
823     return true;
824 }
825 
DecodeMmsContentType(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)826 bool MmsHeader::DecodeMmsContentType(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)
827 {
828     std::string fieldName;
829     if (!FindHeaderFieldName(fieldId, fieldName)) {
830         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader FindHeaderFieldName fail.", fieldId);
831         return false;
832     }
833     if (mmsContentType_.DecodeMmsContentType(buff, len)) {
834         return true;
835     }
836     return false;
837 }
838 
DecodeMmsMsgUnKnownField(MmsDecodeBuffer &decodeBuffer)839 bool MmsHeader::DecodeMmsMsgUnKnownField(MmsDecodeBuffer &decodeBuffer)
840 {
841     const uint8_t minFieldValue = 0x80;
842     uint8_t oneByte = 0;
843     while (oneByte < minFieldValue) {
844         if (!decodeBuffer.GetOneByte(oneByte)) {
845             TELEPHONY_LOGE("MmsHeader GetOneByte fail.");
846             return false;
847         }
848     }
849     decodeBuffer.DecreasePointer(1);
850     return true;
851 }
852 
DecodeFieldIntegerValue(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)853 bool MmsHeader::DecodeFieldIntegerValue(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)
854 {
855     std::string fieldName;
856     if (!FindHeaderFieldName(fieldId, fieldName)) {
857         TELEPHONY_LOGE("MmsHeader FindHeaderFieldName fail.");
858         return false;
859     }
860 
861     uint64_t value = 0;
862     if (!buff.DecodeInteger(value)) {
863         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader DecodeInteger fail.", fieldId);
864         return false;
865     }
866     auto ret = longValueMap_.emplace(fieldId, value);
867     return ret.second;
868 }
869 
870 /**
871  * @brief DecodeFieldDate
872  * OMA-TS-MMS_ENC-V1_3-20110913-A   section:7.3.14
873  * Value-length (Absolute-token Date-value | Relative-token Delta-seconds-value)
874  * Absolute-token = <Octet 128>
875  * Relative-token = <Octet 129>
876  * @param fieldId
877  * @param buff
878  * @param len
879  * @return true
880  * @return false
881  */
DecodeFieldDate(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)882 bool MmsHeader::DecodeFieldDate(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)
883 {
884     std::string fieldName;
885     if (!FindHeaderFieldName(fieldId, fieldName)) {
886         TELEPHONY_LOGE("MmsHeader FindHeaderFieldName fail.");
887         return false;
888     }
889 
890     const uint8_t relativeToken = 0x81;
891     uint32_t length = 0;
892     if (!buff.DecodeValueLength(length)) {
893         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader DecodeValueLength fail.", fieldId);
894         return false;
895     }
896     /* Absolute-token or Relative-token */
897     uint8_t token = 0;
898     if (!buff.GetOneByte(token)) {
899         TELEPHONY_LOGE("MmsHeader GetOneByte fail.");
900         return false;
901     }
902     /* Date-value or Delta-seconds-value */
903     uint64_t timeValue = 0;
904     if (!buff.DecodeLongInteger(timeValue)) {
905         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader DecodeLongInteger fail.", fieldId);
906         return false;
907     }
908     if (relativeToken == token) {
909         /* need to convert the Delta-seconds-value
910          * into Date-value */
911         chrono::system_clock::duration timePoint = chrono::system_clock::now().time_since_epoch();
912         long timeStamp = chrono::duration_cast<chrono::seconds>(timePoint).count();
913         timeValue += static_cast<uint64_t>(timeStamp);
914     }
915     auto ret = longValueMap_.emplace(fieldId, timeValue);
916     return ret.second;
917 }
918 
919 /**
920  * @brief DecodeFieldPreviouslySentDate
921  * OMA-TS-MMS_ENC-V1_3-20110913-A   section:7.3.24 X-Mms-Previously-Sent-Date Field
922  * Previously-sent-date-value = Value-length Forwarded-count-value Date-value
923  * Forwarded-count-value = Integer-value
924  * Date-value = Long-integer
925  * @param fieldId
926  * @param buff
927  * @param len
928  * @return true
929  * @return false
930  */
DecodeFieldPreviouslySentDate(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)931 bool MmsHeader::DecodeFieldPreviouslySentDate(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)
932 {
933     std::string fieldName;
934     if (!FindHeaderFieldName(fieldId, fieldName)) {
935         TELEPHONY_LOGE("MmsHeader FindHeaderFieldName fail.");
936         return false;
937     }
938 
939     /* Previously-sent-date-value =
940      * Value-length Forwarded-count-value Date-value */
941     /* parse value-length */
942     uint32_t length = 0;
943     uint64_t count = 0;
944     uint64_t perviouslySentDate = 0;
945     if (!buff.DecodeValueLength(length)) {
946         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader DecodeValueLength fail.", fieldId);
947         return false;
948     }
949     /* parse Forwarded-count-value */
950     if (!buff.DecodeInteger(count)) {
951         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader DecodeInteger fail.", fieldId);
952         return false;
953     }
954     if (!buff.DecodeLongInteger(perviouslySentDate)) {
955         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader DecodeLongInteger fail.", fieldId);
956         return false;
957     }
958     auto ret = longValueMap_.emplace(fieldId, perviouslySentDate);
959     return ret.second;
960 }
961 
962 /**
963  * @brief DecodeFieldMBox
964  * OMA-TS-MMS_ENC-V1_3-20110913-A   section:7.3.25
965  * Value-length (Message-quota-token | Size-quota-token) Integer-Value
966  * Message-quota-token = <Octet 128>
967  * Size-quota-token = <Octet 129>
968  * @param fieldId
969  * @param buff
970  * @param len
971  * @return true
972  * @return false
973  */
DecodeFieldMBox(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)974 bool MmsHeader::DecodeFieldMBox(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)
975 {
976     std::string fieldName;
977     if (!FindHeaderFieldName(fieldId, fieldName)) {
978         TELEPHONY_LOGE("MmsHeader FindHeaderFieldName fail.");
979         return false;
980     }
981 
982     /* Value-length
983      * (Message-total-token | Size-total-token) Integer-Value */
984     uint32_t length = 0;
985     if (!buff.DecodeValueLength(length)) {
986         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader DecodeValueLength fail.", fieldId);
987         return false;
988     }
989     uint8_t token = 0;
990     if (!buff.GetOneByte(token)) {
991         TELEPHONY_LOGE("MmsHeader GetOneByte fail.");
992         return false;
993     }
994     uint64_t value = 0;
995     if (!buff.DecodeInteger(value)) {
996         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader DecodeInteger fail.", fieldId);
997         return false;
998     }
999     return true;
1000 }
1001 
1002 /**
1003  * @brief DecodeFieldMMFlag
1004  * OMA-TS-MMS_ENC-V1_3-20110913-A   section:7.3.32 X-Mms-MM-Flags Field
1005  * Value-length ( Add-token | Remove-token | Filter-token ) Encoded-string-value
1006  * Add-token = <Octet 128>
1007  * Remove-token = <Octet 129>
1008  * Filter-token = <Octet 130>
1009  * @param fieldId
1010  * @param buff
1011  * @param len
1012  * @return true
1013  * @return false
1014  */
DecodeFieldMMFlag(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)1015 bool MmsHeader::DecodeFieldMMFlag(uint8_t fieldId, MmsDecodeBuffer &buff, int32_t &len)
1016 {
1017     std::string fieldName;
1018     if (!FindHeaderFieldName(fieldId, fieldName)) {
1019         TELEPHONY_LOGE("MmsHeader FindHeaderFieldName fail.");
1020         return false;
1021     }
1022 
1023     uint32_t length = 0;
1024     if (!buff.DecodeValueLength(length)) {
1025         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader DecodeValueLength fail.", fieldId);
1026         return false;
1027     }
1028     uint8_t token = 0;
1029     if (!buff.GetOneByte(token)) {
1030         TELEPHONY_LOGE("MmsHeader GetOneByte fail.");
1031         return false;
1032     }
1033     MmsEncodeString encodeString;
1034     if (!encodeString.DecodeEncodeString(buff)) {
1035         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader DecodeEncodeString fail.", fieldId);
1036         return false;
1037     }
1038     return true;
1039 }
1040 
IsHaveBody()1041 bool MmsHeader::IsHaveBody()
1042 {
1043     uint8_t msgType = 0;
1044     GetOctetValue(MMS_MESSAGE_TYPE, msgType);
1045     if (msgType == MMS_MSGTYPE_SEND_REQ || msgType == MMS_MSGTYPE_RETRIEVE_CONF) {
1046         return true;
1047     }
1048     return false;
1049 }
1050 
EncodeOctetValue(MmsEncodeBuffer &buff, uint8_t fieldId, uint8_t value)1051 bool MmsHeader::EncodeOctetValue(MmsEncodeBuffer &buff, uint8_t fieldId, uint8_t value)
1052 {
1053     if (!buff.WriteByte(fieldId)) {
1054         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader WriteByte fail.", fieldId);
1055         return false;
1056     }
1057     if (!buff.WriteByte(value)) {
1058         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader WriteByte fail.", fieldId);
1059         return false;
1060     }
1061     return true;
1062 }
1063 
EncodeShortIntegerValue(MmsEncodeBuffer &buff, uint8_t fieldId, int64_t value)1064 bool MmsHeader::EncodeShortIntegerValue(MmsEncodeBuffer &buff, uint8_t fieldId, int64_t value)
1065 {
1066     if (!buff.WriteByte(fieldId)) {
1067         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader WriteByte fail.", fieldId);
1068         return false;
1069     }
1070     if (!buff.EncodeShortInteger(value)) {
1071         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader EncodeShortInteger fail.", fieldId);
1072         return false;
1073     }
1074     return true;
1075 }
1076 
EncodeTextStringValue(MmsEncodeBuffer &buff, uint8_t fieldId, std::string value)1077 bool MmsHeader::EncodeTextStringValue(MmsEncodeBuffer &buff, uint8_t fieldId, std::string value)
1078 {
1079     if (value.empty()) {
1080         TELEPHONY_LOGE("fieldId[%{public}d] EncodeTextStringValue Value Empty fail.", fieldId);
1081         return false;
1082     }
1083     if (!buff.WriteByte(fieldId)) {
1084         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader WriteByte fail.", fieldId);
1085         return false;
1086     }
1087     if (!buff.EncodeText(value)) {
1088         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader EncodeText fail.", fieldId);
1089         return false;
1090     }
1091     return true;
1092 }
1093 
EncodeEncodeStringValue(MmsEncodeBuffer &buff, uint8_t fieldId, MmsEncodeString value)1094 bool MmsHeader::EncodeEncodeStringValue(MmsEncodeBuffer &buff, uint8_t fieldId, MmsEncodeString value)
1095 {
1096     std::string valueUtf8;
1097     if (!value.GetEncodeString(valueUtf8)) {
1098         TELEPHONY_LOGE("fieldId[%{public}d] GetEncodeString Error", fieldId);
1099         return false;
1100     }
1101     if (valueUtf8.empty()) {
1102         TELEPHONY_LOGE("fieldId[%{public}d] GetEncodeString Empty Error", fieldId);
1103         return false;
1104     }
1105 
1106     if (!buff.WriteByte(fieldId)) {
1107         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader WriteByte fail.", fieldId);
1108         return false;
1109     }
1110     if (!value.EncodeEncodeString(buff)) {
1111         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader EncodeEncodeString fail.", fieldId);
1112         return false;
1113     }
1114     return true;
1115 }
1116 
EncodeLongIntergerValue(MmsEncodeBuffer &buff, uint8_t fieldId, int64_t value)1117 bool MmsHeader::EncodeLongIntergerValue(MmsEncodeBuffer &buff, uint8_t fieldId, int64_t value)
1118 {
1119     if (!buff.WriteByte(fieldId)) {
1120         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader WriteByte fail.", fieldId);
1121         return false;
1122     }
1123     if (!buff.EncodeLongInteger(value)) {
1124         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader EncodeLongInteger fail.", fieldId);
1125         return false;
1126     }
1127     return true;
1128 }
1129 
EncodeOctetValueFromMap(MmsEncodeBuffer &buff, uint8_t fieldId)1130 bool MmsHeader::EncodeOctetValueFromMap(MmsEncodeBuffer &buff, uint8_t fieldId)
1131 {
1132     uint8_t value = 0;
1133     if (!GetOctetValue(fieldId, value)) {
1134         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader WriteByte fail.", fieldId);
1135         return false;
1136     }
1137     if (!EncodeOctetValue(buff, fieldId, value)) {
1138         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader EncodeOctetValue fail.", fieldId);
1139         return false;
1140     }
1141     return true;
1142 }
1143 
EncodeTextStringValueFromMap(MmsEncodeBuffer &buff, uint8_t fieldId)1144 bool MmsHeader::EncodeTextStringValueFromMap(MmsEncodeBuffer &buff, uint8_t fieldId)
1145 {
1146     std::string value = "";
1147     if (!GetTextValue(fieldId, value)) {
1148         TELEPHONY_LOGE("The fieldId[%{public}d] GetTextValue fail.", fieldId);
1149         return false;
1150     }
1151     if (!EncodeTextStringValue(buff, fieldId, value)) {
1152         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader EncodeTextStringValue fail.", fieldId);
1153         return false;
1154     }
1155     return true;
1156 }
1157 
EnocdeEncodeStringValueFromMap(MmsEncodeBuffer &buff, uint8_t fieldId)1158 bool MmsHeader::EnocdeEncodeStringValueFromMap(MmsEncodeBuffer &buff, uint8_t fieldId)
1159 {
1160     MmsEncodeString value;
1161     if (!GetEncodeStringValue(fieldId, value)) {
1162         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader GetEncodeStringValue fail.", fieldId);
1163         return false;
1164     }
1165     if (!EncodeEncodeStringValue(buff, fieldId, value)) {
1166         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader EncodeEncodeStringValue fail.", fieldId);
1167         return false;
1168     }
1169     return true;
1170 }
1171 
EncodeLongIntergerValueFromMap(MmsEncodeBuffer &buff, uint8_t fieldId)1172 bool MmsHeader::EncodeLongIntergerValueFromMap(MmsEncodeBuffer &buff, uint8_t fieldId)
1173 {
1174     int64_t value = 0;
1175     if (!GetLongValue(fieldId, value)) {
1176         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader GetLongValue fail.", fieldId);
1177         return false;
1178     }
1179     if (!EncodeLongIntergerValue(buff, fieldId, value)) {
1180         TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader EncodeLongIntergerValue fail.", fieldId);
1181         return false;
1182     }
1183     return true;
1184 }
1185 
EncodeFieldExpriyValue(MmsEncodeBuffer &buff, int64_t value)1186 bool MmsHeader::EncodeFieldExpriyValue(MmsEncodeBuffer &buff, int64_t value)
1187 {
1188     if (!buff.WriteByte(MMS_EXPIRY)) {
1189         TELEPHONY_LOGE("MmsHeader WriteByte fail.");
1190         return false;
1191     }
1192 
1193     const uint8_t relativeToken = 129;
1194     MmsEncodeBuffer tempBuf;
1195     if (!tempBuf.EncodeOctet(relativeToken)) {
1196         TELEPHONY_LOGE("MmsHeader EncodeOctet fail.");
1197         return false;
1198     }
1199     if (!tempBuf.EncodeLongInteger(value)) {
1200         TELEPHONY_LOGE("MmsHeader EncodeLongInteger fail.");
1201         return false;
1202     }
1203     if (!buff.EncodeValueLength(tempBuf.GetCurPosition())) {
1204         TELEPHONY_LOGE("MmsHeader EncodeValueLength fail.");
1205         return false;
1206     }
1207     if (!buff.WriteBuffer(tempBuf)) {
1208         TELEPHONY_LOGE("MmsHeader WriteByte fail.");
1209         return false;
1210     }
1211     return true;
1212 }
1213 
1214 /**
1215  * @brief EncodeFieldFromValue
1216  * OMA-TS-MMS_ENC-V1_3-20110913-A   section:7.3.21 From Field
1217  * From-value = Value-length (Address-present-token Encoded-string-value | Insert-address-token)
1218  * Address-present-token = <Octet 128>
1219  * Insert-address-token = <Octet 129>
1220  * @param buff
1221  * @param addr
1222  * @return true
1223  * @return false
1224  */
EncodeFieldFromValue(MmsEncodeBuffer &buff, std::vector<MmsAddress> &addr)1225 bool MmsHeader::EncodeFieldFromValue(MmsEncodeBuffer &buff, std::vector<MmsAddress> &addr)
1226 {
1227     auto it = addressMap_.find(MMS_FROM);
1228     if (it != addressMap_.end()) {
1229         if (!buff.WriteByte(MMS_FROM)) {
1230             TELEPHONY_LOGE("MmsHeader WriteByte fail.");
1231             return false;
1232         }
1233         // Value-length (Address-present-token Encoded-string-value | Insert-address-token)
1234         const uint8_t addressPresentToken = 128;
1235         const uint8_t insertAddressToken = 129;
1236         MmsEncodeBuffer tempBuff;
1237         if (addr.empty() || addr[0].GetAddressString().empty()) {
1238             if (!tempBuff.WriteByte(insertAddressToken)) {
1239                 TELEPHONY_LOGE("MmsHeader WriteByte fail.");
1240                 return false;
1241             }
1242         } else {
1243             if (!tempBuff.WriteByte(addressPresentToken)) {
1244                 TELEPHONY_LOGE("MmsHeader WriteByte fail.");
1245                 return false;
1246             }
1247 
1248             MmsEncodeString encodeString;
1249             encodeString.SetAddressString(addr[0]);
1250             if (!encodeString.EncodeEncodeString(tempBuff)) {
1251                 TELEPHONY_LOGE("MmsHeader EncodeEncodeString fail.");
1252                 return false;
1253             }
1254         }
1255         if (!buff.EncodeValueLength(tempBuff.GetCurPosition())) {
1256             TELEPHONY_LOGE("MmsHeader EncodeValueLength fail.");
1257             return false;
1258         }
1259         if (!buff.WriteBuffer(tempBuff)) {
1260             TELEPHONY_LOGE("MmsHeader WriteByte fail.");
1261             return false;
1262         }
1263         addressMap_.erase(it);
1264     }
1265     return true;
1266 }
1267 
EncodeMultipleAddressValue(MmsEncodeBuffer &buff, uint8_t fieldId, std::vector<MmsAddress> &addrs)1268 bool MmsHeader::EncodeMultipleAddressValue(MmsEncodeBuffer &buff, uint8_t fieldId, std::vector<MmsAddress> &addrs)
1269 {
1270     if (addrs.empty()) {
1271         TELEPHONY_LOGE("MmsHeader address is invalid.");
1272         return false;
1273     }
1274 
1275     for (auto addr : addrs) {
1276         if (!buff.WriteByte(fieldId)) {
1277             TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader WriteByte fail.", fieldId);
1278             return false;
1279         }
1280         MmsEncodeString encodeString;
1281         encodeString.SetAddressString(addr);
1282         if (!encodeString.EncodeEncodeString(buff)) {
1283             TELEPHONY_LOGE("The fieldId[%{public}d] MmsHeader EncodeEncodeString fail.", fieldId);
1284             return false;
1285         }
1286     }
1287     return true;
1288 }
1289 
EcondeFieldMessageClassValue(MmsEncodeBuffer &buff)1290 bool MmsHeader::EcondeFieldMessageClassValue(MmsEncodeBuffer &buff)
1291 {
1292     uint8_t valueOctet = 0;
1293     if (GetOctetValue(MMS_MESSAGE_CLASS, valueOctet)) {
1294         return EncodeOctetValue(buff, MMS_MESSAGE_CLASS, valueOctet);
1295     }
1296 
1297     std::string strValue = "";
1298     if (GetTextValue(MMS_MESSAGE_CLASS, strValue)) {
1299         if (strValue == "personal") {
1300             valueOctet = static_cast<uint8_t>(MmsMessageClass::PERSONAL);
1301         } else if (strValue == "advertisement") {
1302             valueOctet = static_cast<uint8_t>(MmsMessageClass::ADVERTISEMENT);
1303         } else if (strValue == "informational") {
1304             valueOctet = static_cast<uint8_t>(MmsMessageClass::INFORMATIONAL);
1305         } else if (strValue == "auto") {
1306             valueOctet = static_cast<uint8_t>(MmsMessageClass::AUTO);
1307         }
1308 
1309         if (valueOctet != 0) {
1310             return EncodeOctetValue(buff, MMS_MESSAGE_CLASS, valueOctet);
1311         }
1312         return EncodeTextStringValue(buff, MMS_MESSAGE_CLASS, strValue);
1313     }
1314     return false;
1315 }
1316 
EncodeCommontFieldValue(MmsEncodeBuffer &buff)1317 bool MmsHeader::EncodeCommontFieldValue(MmsEncodeBuffer &buff)
1318 {
1319     uint8_t messageType = 0;
1320     GetOctetValue(MMS_MESSAGE_TYPE, messageType);
1321     if (!EncodeOctetValue(buff, MMS_MESSAGE_TYPE, messageType)) {
1322         TELEPHONY_LOGE("MmsHeader EncodeOctetValue fail.");
1323         return false;
1324     }
1325 
1326     std::string transactionId = "";
1327     if (GetTextValue(MMS_TRANSACTION_ID, transactionId)) {
1328         if (!EncodeTextStringValue(buff, MMS_TRANSACTION_ID, transactionId)) {
1329             TELEPHONY_LOGE("MmsHeader EncodeTextStringValue fail.");
1330             return false;
1331         }
1332     }
1333 
1334     int64_t version = 0;
1335     GetLongValue(MMS_MMS_VERSION, version); // 8bit shortInteger
1336     if (!EncodeShortIntegerValue(buff, MMS_MMS_VERSION, version)) {
1337         TELEPHONY_LOGE("MmsHeader EncodeShortIntegerValue fail.");
1338         return false;
1339     }
1340     return true;
1341 }
1342 
1343 /**
1344  * @brief EncodeMmsSendReq
1345  * OMA-TS-MMS_ENC-V1_3-20110913-A   section:6.1.1 Send Request
1346  * @param buff
1347  * @return true
1348  * @return false
1349  */
EncodeMmsSendReq(MmsEncodeBuffer &buff)1350 bool MmsHeader::EncodeMmsSendReq(MmsEncodeBuffer &buff)
1351 {
1352     // FROM
1353     std::vector<MmsAddress> fromAddress;
1354     GetHeaderAllAddressValue(MMS_FROM, fromAddress);
1355     if (!EncodeFieldFromValue(buff, fromAddress)) {
1356         TELEPHONY_LOGE("encode mandatory from field error.");
1357         return false;
1358     }
1359     // Optional
1360     int64_t mmsExpriy = 0;
1361     if (GetLongValue(MMS_EXPIRY, mmsExpriy)) {
1362         EncodeFieldExpriyValue(buff, mmsExpriy);
1363     }
1364     // CC BCC TO
1365     for (auto it = addressMap_.begin(); it != addressMap_.end(); it++) {
1366         EncodeMultipleAddressValue(buff, it->first, it->second);
1367     }
1368 
1369     EcondeFieldMessageClassValue(buff); // MMS_MESSAGE_CLASS
1370     EncodeLongIntergerValueFromMap(buff, MMS_DATE);
1371     EnocdeEncodeStringValueFromMap(buff, MMS_SUBJECT);
1372     EncodeTextStringValueFromMap(buff, MMS_MESSAGE_CLASS);
1373     EncodeOctetValueFromMap(buff, MMS_PRIORITY);
1374     EncodeOctetValueFromMap(buff, MMS_SENDER_VISIBILITY);
1375     EncodeOctetValueFromMap(buff, MMS_DELIVERY_REPORT);
1376     EncodeOctetValueFromMap(buff, MMS_READ_REPORT);
1377     return true;
1378 }
1379 
1380 /**
1381  * @brief EncodeMmsSendConf
1382  * OMA-TS-MMS_ENC-V1_3-20110913-A   section:6.1.2 Send Confirmationt
1383  * @param buff
1384  * @return true
1385  * @return false
1386  */
EncodeMmsSendConf(MmsEncodeBuffer &buff)1387 bool MmsHeader::EncodeMmsSendConf(MmsEncodeBuffer &buff)
1388 {
1389     // Mandatory
1390     if (!EncodeOctetValueFromMap(buff, MMS_RESPONSE_STATUS)) {
1391         TELEPHONY_LOGE("encode mandatory response status field error.");
1392         return false;
1393     }
1394     // Optional
1395     EncodeTextStringValueFromMap(buff, MMS_MESSAGE_ID);
1396     return true;
1397 }
1398 
1399 /**
1400  * @brief EncodeMmsNotificationInd
1401  * OMA-TS-MMS_ENC-V1_3-20110913-A   section:6.2 Multimedia Message Notification
1402  * @param buff
1403  * @return true
1404  * @return false
1405  */
EncodeMmsNotificationInd(MmsEncodeBuffer &buff)1406 bool MmsHeader::EncodeMmsNotificationInd(MmsEncodeBuffer &buff)
1407 {
1408     // Mandatory
1409     if (!EncodeTextStringValueFromMap(buff, MMS_CONTENT_LOCATION)) {
1410         TELEPHONY_LOGE("encode mandatory content location field error.");
1411         return false;
1412     }
1413     if (!EncodeLongIntergerValueFromMap(buff, MMS_MESSAGE_SIZE)) {
1414         TELEPHONY_LOGE("encode mandatory message size field error.");
1415         return false;
1416     }
1417     int64_t mmsExpriy = 0;
1418     if (!GetLongValue(MMS_EXPIRY, mmsExpriy)) {
1419         TELEPHONY_LOGE("get mandatory expriy field no set error.");
1420         return false;
1421     }
1422     if (!EncodeFieldExpriyValue(buff, mmsExpriy)) {
1423         TELEPHONY_LOGE("encode mandatory expriy field error.");
1424         return false;
1425     }
1426     if (!EcondeFieldMessageClassValue(buff)) { // MMS_MESSAGE_CLASS
1427         TELEPHONY_LOGE("encode mandatory message class field error.");
1428         return false;
1429     }
1430 
1431     // Optional
1432     std::vector<MmsAddress> fromAddress;
1433     if (GetHeaderAllAddressValue(MMS_FROM, fromAddress)) {
1434         EncodeFieldFromValue(buff, fromAddress);
1435     }
1436     EncodeOctetValueFromMap(buff, MMS_CONTENT_CLASS);
1437     EnocdeEncodeStringValueFromMap(buff, MMS_SUBJECT);
1438     EncodeOctetValueFromMap(buff, MMS_DELIVERY_REPORT);
1439     return true;
1440 }
1441 
1442 /**
1443  * @brief EnocdeMmsNotifyRespInd
1444  * OMA-TS-MMS_ENC-V1_3-20110913-A   section:6.2 Multimedia Message Notification
1445  * @param buff
1446  * @return true
1447  * @return false
1448  */
EnocdeMmsNotifyRespInd(MmsEncodeBuffer &buff)1449 bool MmsHeader::EnocdeMmsNotifyRespInd(MmsEncodeBuffer &buff)
1450 {
1451     // Mandatory
1452     if (!EncodeOctetValueFromMap(buff, MMS_STATUS)) {
1453         TELEPHONY_LOGE("encode mandatory mms status field error.");
1454         return false;
1455     }
1456     // Optional
1457     EncodeOctetValueFromMap(buff, MMS_REPORT_ALLOWED);
1458     return true;
1459 }
1460 
1461 /**
1462  * @brief EnocdeMmsRetrieveConf
1463  * OMA-TS-MMS_ENC-V1_3-20110913-A   section:6.3 Retrieval of Multimedia Message
1464  * @param buff
1465  * @return true
1466  * @return false
1467  */
EnocdeMmsRetrieveConf(MmsEncodeBuffer &buff)1468 bool MmsHeader::EnocdeMmsRetrieveConf(MmsEncodeBuffer &buff)
1469 {
1470     // Mandatory
1471     if (!EncodeLongIntergerValueFromMap(buff, MMS_DATE)) {
1472         TELEPHONY_LOGE("encode mandatory mms date field error.");
1473         return false;
1474     }
1475 
1476     // Optional
1477     EncodeTextStringValueFromMap(buff, MMS_MESSAGE_ID); // Conditional
1478     std::vector<MmsAddress> fromAddress;
1479     if (GetHeaderAllAddressValue(MMS_FROM, fromAddress)) {
1480         EncodeFieldFromValue(buff, fromAddress);
1481     }
1482     std::vector<MmsAddress> toAddress;
1483     if (GetHeaderAllAddressValue(MMS_TO, toAddress)) {
1484         if (!EncodeMultipleAddressValue(buff, MMS_TO, toAddress)) {
1485             TELEPHONY_LOGE("MmsHeader EncodeMultipleAddressValue fail.");
1486             return false;
1487         }
1488     }
1489     std::vector<MmsAddress> ccAddress;
1490     if (GetHeaderAllAddressValue(MMS_CC, ccAddress)) {
1491         if (!EncodeMultipleAddressValue(buff, MMS_CC, ccAddress)) {
1492             TELEPHONY_LOGE("MmsHeader EncodeMultipleAddressValue fail.");
1493             return false;
1494         }
1495     }
1496     EcondeFieldMessageClassValue(buff); // MMS_MESSAGE_CLASS
1497     EnocdeEncodeStringValueFromMap(buff, MMS_SUBJECT);
1498     EncodeOctetValueFromMap(buff, MMS_PRIORITY);
1499     EncodeOctetValueFromMap(buff, MMS_DELIVERY_REPORT);
1500     EncodeOctetValueFromMap(buff, MMS_READ_REPORT);
1501     EncodeOctetValueFromMap(buff, MMS_RETRIEVE_STATUS);
1502     EnocdeEncodeStringValueFromMap(buff, MMS_RETRIEVE_TEXT);
1503     // MMS_PREVIOUSLY_SENT_BY unSupported
1504     // MMS_PREVIOUSLY_SENT_DATE unSupported
1505     // MMS_MM_STATE unSupported
1506     // MMS_MM_FLAGS unSupported
1507     // MMS_REPLY_CHARGING unSupported
1508     // MMS_REPLY_CHARGING_DEADLINE unSupported
1509     // MMS_REPLY_CHARGING_SIZE unSupported
1510     // MMS_REPLY_CHARGING_ID unSupported
1511     // MMS_DISTRIBUTION_INDICATOR unSupported
1512     // MMS_APPLIC_ID unSupported
1513     // MMS_REPLY_APPLIC_ID unSupported
1514     // MMS_AUX_APPLIC_INFO unSupported
1515     // MMS_CONTENT_CLASS unSupported
1516     // MMS_DRM_CONTENT unSupported
1517     // MMS_REPLACE_ID unSupported
1518     return true;
1519 }
1520 
1521 /**
1522  * @brief EnocdeMmsAcknowledgeInd
1523  * OMA-TS-MMS_ENC-V1_3-20110913-A   section:6.4 Delivery Acknowledgement
1524  * @param buff
1525  * @return true
1526  * @return false
1527  */
EnocdeMmsAcknowledgeInd(MmsEncodeBuffer &buff)1528 bool MmsHeader::EnocdeMmsAcknowledgeInd(MmsEncodeBuffer &buff)
1529 {
1530     // Optional
1531     EncodeOctetValueFromMap(buff, MMS_REPORT_ALLOWED);
1532     return true;
1533 }
1534 
1535 /**
1536  * @brief EnocdeMmsDeliveryInd
1537  * OMA-TS-MMS_ENC-V1_3-20110913-A   section:6.6 Delivery Reporting
1538  * @param buff
1539  * @return true
1540  * @return false
1541  */
EnocdeMmsDeliveryInd(MmsEncodeBuffer &buff)1542 bool MmsHeader::EnocdeMmsDeliveryInd(MmsEncodeBuffer &buff)
1543 {
1544     // Mandatory
1545     std::vector<MmsAddress> toAddress;
1546     if (!GetHeaderAllAddressValue(MMS_TO, toAddress)) {
1547         TELEPHONY_LOGE("get mandatory mms to field no set error.");
1548         return false;
1549     }
1550     if (!EncodeMultipleAddressValue(buff, MMS_TO, toAddress)) {
1551         TELEPHONY_LOGE("encode mandatory mms to field error.");
1552         return false;
1553     }
1554     if (!EncodeTextStringValueFromMap(buff, MMS_MESSAGE_ID)) {
1555         TELEPHONY_LOGE("encode mandatory mms message id field error.");
1556         return false;
1557     }
1558     if (!EncodeLongIntergerValueFromMap(buff, MMS_DATE)) {
1559         TELEPHONY_LOGE("encode mandatory mms date field error.");
1560         return false;
1561     }
1562     if (!EncodeOctetValueFromMap(buff, MMS_STATUS)) {
1563         TELEPHONY_LOGE("encode mandatory mms status field error.");
1564         return false;
1565     }
1566     // Optional
1567     return true;
1568 }
1569 
1570 /**
1571  * @brief EncodeMmsReadRecInd
1572  * OMA-TS-MMS_ENC-V1_3-20110913-A   section:6.7.2 PDU Read Report
1573  * @param buff
1574  * @return true
1575  * @return false
1576  */
EncodeMmsReadRecInd(MmsEncodeBuffer &buff)1577 bool MmsHeader::EncodeMmsReadRecInd(MmsEncodeBuffer &buff)
1578 {
1579     // Mandatory
1580     if (!EncodeTextStringValueFromMap(buff, MMS_MESSAGE_ID)) {
1581         TELEPHONY_LOGE("encode mandatory mms message id field error.");
1582         return false;
1583     }
1584     std::vector<MmsAddress> toAddress;
1585     if (!GetHeaderAllAddressValue(MMS_TO, toAddress)) {
1586         TELEPHONY_LOGE("get mandatory mms to field no set error.");
1587         return false;
1588     }
1589     if (!EncodeMultipleAddressValue(buff, MMS_TO, toAddress)) {
1590         TELEPHONY_LOGE("encode mandatory mms to field error.");
1591         return false;
1592     }
1593 
1594     std::vector<MmsAddress> fromAddress;
1595     GetHeaderAllAddressValue(MMS_FROM, fromAddress);
1596     if (!EncodeFieldFromValue(buff, fromAddress)) {
1597         TELEPHONY_LOGE("encode mandatory mms from field error.");
1598         return false;
1599     }
1600 
1601     if (!EncodeOctetValueFromMap(buff, MMS_READ_STATUS)) {
1602         TELEPHONY_LOGE("encode mandatory mms read status field error.");
1603         return false;
1604     }
1605     // Optional
1606     EncodeLongIntergerValueFromMap(buff, MMS_DATE);
1607     // MMS_APPLIC_ID unSupported
1608     // MMS_REPLY_APPLIC_ID unSupported
1609     // MMS_AUX_APPLIC_INFO unSupported
1610     return true;
1611 }
1612 
1613 /**
1614  * @brief EncodeMmsReadOrigInd
1615  * OMA-TS-MMS_ENC-V1_3-20110913-A   section:6.7.2 PDU Read Report
1616  * @param buff
1617  * @return true
1618  * @return false
1619  */
EncodeMmsReadOrigInd(MmsEncodeBuffer &buff)1620 bool MmsHeader::EncodeMmsReadOrigInd(MmsEncodeBuffer &buff)
1621 {
1622     // Mandatory
1623     if (!EncodeTextStringValueFromMap(buff, MMS_MESSAGE_ID)) {
1624         TELEPHONY_LOGE("encode mandatory mms message id field error.");
1625         return false;
1626     }
1627     std::vector<MmsAddress> toAddress;
1628     if (!GetHeaderAllAddressValue(MMS_TO, toAddress)) {
1629         TELEPHONY_LOGE("get mandatory mms to field no set error.");
1630         return false;
1631     }
1632     if (!EncodeMultipleAddressValue(buff, MMS_TO, toAddress)) {
1633         TELEPHONY_LOGE("encode mandatory mms to field error.");
1634         return false;
1635     }
1636 
1637     std::vector<MmsAddress> fromAddress;
1638     GetHeaderAllAddressValue(MMS_FROM, fromAddress);
1639     if (!EncodeFieldFromValue(buff, fromAddress)) {
1640         TELEPHONY_LOGE("encode mandatory mms from field error.");
1641         return false;
1642     }
1643 
1644     if (!EncodeOctetValueFromMap(buff, MMS_READ_STATUS)) {
1645         TELEPHONY_LOGE("encode mandatory mms read status field error.");
1646         return false;
1647     }
1648     if (!EncodeLongIntergerValueFromMap(buff, MMS_DATE)) {
1649         TELEPHONY_LOGE("encode mandatory mms date field error.");
1650         return false;
1651     }
1652     // Optional
1653     // MMS_APPLIC_ID unSupported
1654     // MMS_REPLY_APPLIC_ID unSupported
1655     // MMS_AUX_APPLIC_INFO unSupported
1656     return true;
1657 }
1658 
IsHaveTransactionId(uint8_t messageType)1659 bool MmsHeader::IsHaveTransactionId(uint8_t messageType)
1660 {
1661     if (messageType == MMS_MSGTYPE_SEND_REQ || messageType == MMS_MSGTYPE_SEND_CONF ||
1662         messageType == MMS_MSGTYPE_NOTIFICATION_IND || messageType == MMS_MSGTYPE_NOTIFYRESP_IND ||
1663         messageType == MMS_MSGTYPE_RETRIEVE_CONF || messageType == MMS_MSGTYPE_ACKNOWLEDGE_IND) {
1664         return true;
1665     }
1666     return false;
1667 }
1668 
CheckResponseStatus(uint8_t value)1669 bool MmsHeader::CheckResponseStatus(uint8_t value)
1670 {
1671     if (value >= static_cast<uint8_t>(MmsResponseStatus::MMS_OK) &&
1672         value <= static_cast<uint8_t>(MmsResponseStatus::MMS_ERROR_UNSUPPORTED_MESSAGE)) {
1673         return true;
1674     }
1675     if (value >= static_cast<uint8_t>(MmsResponseStatus::MMS_ERROR_TRANSIENT_FAILURE) &&
1676         value <= static_cast<uint8_t>(MmsResponseStatus::MMS_ERROR_TRANSIENT_PARTIAL_SUCCESS)) {
1677         return true;
1678     }
1679     if (value >= static_cast<uint8_t>(MmsResponseStatus::MMS_ERROR_PERMANENT_FAILURE) &&
1680         value <= static_cast<uint8_t>(MmsResponseStatus::MMS_ERROR_PERMANENT_LACK_OF_PREPAID)) {
1681         return true;
1682     }
1683     return false;
1684 }
1685 
CheckRetrieveStatus(uint8_t value)1686 bool MmsHeader::CheckRetrieveStatus(uint8_t value)
1687 {
1688     if (value == static_cast<uint8_t>(MmsRetrieveStatus::MMS_RETRIEVE_STATUS_OK)) {
1689         return true;
1690     }
1691     if (value >= static_cast<uint8_t>(MmsRetrieveStatus::MMS_RETRIEVE_STATUS_ERROR_TRANSIENT_FAILURE) &&
1692         value <= static_cast<uint8_t>(MmsRetrieveStatus::MMS_RETRIEVE_STATUS_ERROR_TRANSIENT_NETWORK_PROBLEM)) {
1693         return true;
1694     }
1695     if (value >= static_cast<uint8_t>(MmsRetrieveStatus::MMS_RETRIEVE_STATUS_ERROR_PERMANENT_FAILURE) &&
1696         value <= static_cast<uint8_t>(MmsRetrieveStatus::MMS_RETRIEVE_STATUS_ERROR_PERMANENT_CONTENT_UNSUPPORTED)) {
1697         return true;
1698     }
1699     return false;
1700 }
1701 
CheckStoreStatus(uint8_t value)1702 bool MmsHeader::CheckStoreStatus(uint8_t value)
1703 {
1704     if (value == static_cast<uint8_t>(MmsStoreStatus::MMS_STORE_STATUS_SUCCESS)) {
1705         return true;
1706     }
1707     if (value >= static_cast<uint8_t>(MmsStoreStatus::MMS_STORE_STATUS_ERROR_TRANSIENT_FAILURE) &&
1708         value <= static_cast<uint8_t>(MmsStoreStatus::MMS_STORE_STATUS_ERROR_TRANSIENT_NETWORK_PROBLEM)) {
1709         return true;
1710     }
1711     if (value >= static_cast<uint8_t>(MmsStoreStatus::MMS_STORE_STATUS_ERROR_PERMANENT_FAILURE) &&
1712         value <= static_cast<uint8_t>(MmsStoreStatus::MMS_STORE_STATUS_ERROR_PERMANENT_MMBOX_FULL)) {
1713         return true;
1714     }
1715     return false;
1716 }
1717 
CheckBooleanValue(uint8_t fieldId, uint8_t value)1718 bool MmsHeader::CheckBooleanValue(uint8_t fieldId, uint8_t value)
1719 {
1720     switch (fieldId) {
1721         case MMS_DELIVERY_REPORT:
1722         case MMS_READ_REPORT:
1723         case MMS_REPORT_ALLOWED:
1724         case MMS_STORE:
1725         case MMS_STORED:
1726         case MMS_TOTALS:
1727         case MMS_QUOTAS:
1728         case MMS_DISTRIBUTION_INDICATOR:
1729         case MMS_DRM_CONTENT:
1730         case MMS_ADAPTATION_ALLOWED:
1731             if (value < static_cast<uint8_t>(MmsBoolType::MMS_YES) ||
1732                 value > static_cast<uint8_t>(MmsBoolType::MMS_NO)) {
1733                 return false;
1734             }
1735             break;
1736         default:
1737             return false;
1738     }
1739 
1740     auto ret = octetValueMap_.emplace(fieldId, value);
1741     return ret.second;
1742 }
1743 } // namespace Telephony
1744 } // namespace OHOS
1745