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