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