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