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 "pbap_pce_parameter.h"
17 #include <algorithm>
18 #include <codecvt>
19 #include <locale>
20 #include <iomanip>
21 #include <sstream>
22 #include <fstream>
23 #include "bt_def.h"
24
25 namespace bluetooth {
IPbapPullPhoneBookParam()26 IPbapPullPhoneBookParam::IPbapPullPhoneBookParam()
27 : name_(u""),
28 propertySelector_(0),
29 format_(0),
30 maxListCount_(0),
31 listStartOffset_(0),
32 resetNewMissedCalls_(0),
33 vCardSelector_(0),
34 vCardSelectorOp_(0),
35 specifiedBitset_(0ULL)
36 {}
37
~IPbapPullPhoneBookParam()38 IPbapPullPhoneBookParam::~IPbapPullPhoneBookParam()
39 {}
40
IPbapPullPhoneBookParam(const IPbapPullPhoneBookParam & other)41 IPbapPullPhoneBookParam::IPbapPullPhoneBookParam(const IPbapPullPhoneBookParam &other)
42 : name_(other.name_),
43 propertySelector_(other.propertySelector_),
44 format_(other.format_),
45 maxListCount_(other.maxListCount_),
46 listStartOffset_(other.listStartOffset_),
47 resetNewMissedCalls_(other.resetNewMissedCalls_),
48 vCardSelector_(other.vCardSelector_),
49 vCardSelectorOp_(other.vCardSelectorOp_),
50 specifiedBitset_(other.specifiedBitset_)
51 {}
52
ToDebugString() const53 std::string IPbapPullPhoneBookParam::ToDebugString() const
54 {
55 std::stringstream ss;
56 std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter;
57 ss << "IPbapPullPhoneBookParam:" << std::endl;
58 ss << "name:" << converter.to_bytes(GetName())
59 << std::endl;
60 if (IsSpecified(IPbapPullPhoneBookParam::PROPERTY_SELECTOR)) {
61 ss << "propertySelector:" << GetPropertySelector() << std::endl;
62 }
63 if (IsSpecified(IPbapPullPhoneBookParam::FORMAT)) {
64 ss << "format:" << (int)GetFormat() << std::endl;
65 }
66 if (IsSpecified(IPbapPullPhoneBookParam::MAX_LIST_COUNT)) {
67 ss << "maxListCount:" << GetMaxListCount() << std::endl;
68 }
69 if (IsSpecified(IPbapPullPhoneBookParam::LIST_START_OFFSET)) {
70 ss << "listStartOffset:" << GetListStartOffset() << std::endl;
71 }
72 if (IsSpecified(IPbapPullPhoneBookParam::RESET_NEW_MISSED_CALLS)) {
73 ss << "resetNewMissedCalls:" << (int)GetResetNewMissedCalls() << std::endl;
74 }
75 if (IsSpecified(IPbapPullPhoneBookParam::VCARD_SELECTOR)) {
76 ss << "vCardSelector:" << GetvCardSelector() << std::endl;
77 }
78 if (IsSpecified(IPbapPullPhoneBookParam::VCARD_SELECTOROP)) {
79 ss << "vCardSelectorOp:" << (int)GetvCardSelectorOp() << std::endl;
80 }
81 return ss.str();
82 }
83
Validate() const84 bool IPbapPullPhoneBookParam::Validate() const
85 {
86 if ((format_ != PBAP_FORMAT_VCARD2_1) && (format_ != PBAP_FORMAT_VCARD3_0)) {
87 return false;
88 }
89
90 if ((vCardSelectorOp_ != PBAP_SELECTOR_OPERATOR_OR) && (vCardSelectorOp_ != PBAP_SELECTOR_OPERATOR_AND)) {
91 return false;
92 }
93
94 return true;
95 }
96
GetName() const97 std::u16string IPbapPullPhoneBookParam::GetName() const
98 {
99 return name_;
100 }
101
SetName(const std::u16string & name)102 void IPbapPullPhoneBookParam::SetName(const std::u16string &name)
103 {
104 name_ = name;
105 specifiedBitset_ |= NAME;
106 }
107
GetPropertySelector() const108 uint64_t IPbapPullPhoneBookParam::GetPropertySelector() const
109 {
110 return propertySelector_;
111 }
112
SetPropertySelector(uint64_t propertySelector)113 void IPbapPullPhoneBookParam::SetPropertySelector(uint64_t propertySelector)
114 {
115 propertySelector_ = propertySelector;
116 specifiedBitset_ |= PROPERTY_SELECTOR;
117 }
118
GetFormat() const119 uint8_t IPbapPullPhoneBookParam::GetFormat() const
120 {
121 return format_;
122 }
123
SetFormat(uint8_t format)124 void IPbapPullPhoneBookParam::SetFormat(uint8_t format)
125 {
126 format_ = format;
127 specifiedBitset_ |= FORMAT;
128 }
129
GetMaxListCount() const130 uint16_t IPbapPullPhoneBookParam::GetMaxListCount() const
131 {
132 return maxListCount_;
133 }
134
SetMaxListCount(uint16_t maxListCount)135 void IPbapPullPhoneBookParam::SetMaxListCount(uint16_t maxListCount)
136 {
137 maxListCount_ = maxListCount;
138 specifiedBitset_ |= MAX_LIST_COUNT;
139 }
140
GetListStartOffset() const141 uint16_t IPbapPullPhoneBookParam::GetListStartOffset() const
142 {
143 return listStartOffset_;
144 }
145
SetListStartOffset(uint16_t listStartOffset)146 void IPbapPullPhoneBookParam::SetListStartOffset(uint16_t listStartOffset)
147 {
148 listStartOffset_ = listStartOffset;
149 specifiedBitset_ |= LIST_START_OFFSET;
150 }
151
GetResetNewMissedCalls() const152 uint8_t IPbapPullPhoneBookParam::GetResetNewMissedCalls() const
153 {
154 return resetNewMissedCalls_;
155 }
156
SetResetNewMissedCalls(uint8_t resetNewMissedCalls)157 void IPbapPullPhoneBookParam::SetResetNewMissedCalls(uint8_t resetNewMissedCalls)
158 {
159 resetNewMissedCalls_ = resetNewMissedCalls;
160 specifiedBitset_ |= RESET_NEW_MISSED_CALLS;
161 }
162
GetvCardSelector() const163 uint64_t IPbapPullPhoneBookParam::GetvCardSelector() const
164 {
165 return vCardSelector_;
166 }
167
SetvCardSelector(uint64_t vCardSelector)168 void IPbapPullPhoneBookParam::SetvCardSelector(uint64_t vCardSelector)
169 {
170 vCardSelector_ = vCardSelector;
171 specifiedBitset_ |= VCARD_SELECTOR;
172 }
173
GetvCardSelectorOp() const174 uint8_t IPbapPullPhoneBookParam::GetvCardSelectorOp() const
175 {
176 return vCardSelectorOp_;
177 }
178
SetvCardSelectorOp(uint8_t vCardSelectorOp)179 void IPbapPullPhoneBookParam::SetvCardSelectorOp(uint8_t vCardSelectorOp)
180 {
181 vCardSelectorOp_ = vCardSelectorOp;
182 specifiedBitset_ |= VCARD_SELECTOROP;
183 }
184
GetSpecifiedBitset() const185 uint64_t IPbapPullPhoneBookParam::GetSpecifiedBitset() const
186 {
187 return specifiedBitset_;
188 }
189
SetSpecifiedBitset(uint64_t specifiedBitset)190 void IPbapPullPhoneBookParam::SetSpecifiedBitset(uint64_t specifiedBitset)
191 {
192 specifiedBitset_ = specifiedBitset;
193 }
194
IsSpecified(int bitSpecified) const195 bool IPbapPullPhoneBookParam::IsSpecified(int bitSpecified) const
196 {
197 if (bitSpecified & specifiedBitset_) {
198 return true;
199 } else {
200 return false;
201 }
202 }
203
204 // IPbapPullvCardListingParam
IPbapPullvCardListingParam()205 IPbapPullvCardListingParam::IPbapPullvCardListingParam()
206 : name_(u""),
207 order_(0),
208 searchValue_(""),
209 searchProperty_(0),
210 maxListCount_(0),
211 listStartOffset_(0),
212 resetNewMissedCalls_(0),
213 vCardSelector_(0),
214 vCardSelectorOp_(0),
215 specifiedBitset_(0ULL)
216 {}
217
~IPbapPullvCardListingParam()218 IPbapPullvCardListingParam::~IPbapPullvCardListingParam()
219 {}
220
IPbapPullvCardListingParam(const IPbapPullvCardListingParam & other)221 IPbapPullvCardListingParam::IPbapPullvCardListingParam(const IPbapPullvCardListingParam &other)
222 : name_(other.name_),
223 order_(other.order_),
224 searchValue_(other.searchValue_),
225 searchProperty_(other.searchProperty_),
226 maxListCount_(other.maxListCount_),
227 listStartOffset_(other.listStartOffset_),
228 resetNewMissedCalls_(other.resetNewMissedCalls_),
229 vCardSelector_(other.vCardSelector_),
230 vCardSelectorOp_(other.vCardSelectorOp_),
231 specifiedBitset_(other.specifiedBitset_)
232 {}
233
ToDebugString() const234 std::string IPbapPullvCardListingParam::ToDebugString() const
235 {
236 std::stringstream ss;
237 ss << "IPbapPullvCardListingParam:" << std::endl;
238 std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter;
239 ss << "name:" << converter.to_bytes(GetName())
240 << std::endl;
241 if (IsSpecified(IPbapPullvCardListingParam::ORDER)) {
242 ss << "order:" << (int)GetOrder() << std::endl;
243 }
244 if (IsSpecified(IPbapPullvCardListingParam::SEARCH_VALUE)) {
245 ss << "searchValue:" << GetSearchValue() << std::endl;
246 }
247 if (IsSpecified(IPbapPullvCardListingParam::SEARCH_PROPERTY)) {
248 ss << "searchProperty:" << (int)GetSearchProperty() << std::endl;
249 }
250 if (IsSpecified(IPbapPullvCardListingParam::MAX_LIST_COUNT)) {
251 ss << "maxListCount:" << GetMaxListCount() << std::endl;
252 }
253 if (IsSpecified(IPbapPullvCardListingParam::LIST_START_OFFSET)) {
254 ss << "listStartOffset:" << GetListStartOffset() << std::endl;
255 }
256 if (IsSpecified(IPbapPullvCardListingParam::RESET_NEW_MISSED_CALLS)) {
257 ss << "resetNewMissedCalls:" << (int)GetResetNewMissedCalls() << std::endl;
258 }
259 if (IsSpecified(IPbapPullvCardListingParam::VCARD_SELECTOR)) {
260 ss << "vCardSelector:" << GetvCardSelector() << std::endl;
261 }
262 if (IsSpecified(IPbapPullvCardListingParam::VCARD_SELECTOROP)) {
263 ss << "vCardSelectorOp:" << (int)GetvCardSelectorOp() << std::endl;
264 }
265 return ss.str();
266 }
267
Validate() const268 bool IPbapPullvCardListingParam::Validate() const
269 {
270 std::vector<int> orders = {
271 PBAP_ORDER_INDEXED,
272 PBAP_ORDER_ALPHANUMERIC,
273 PBAP_ORDER_PHONETIC
274 };
275 if (std::find(orders.begin(), orders.end(), order_) == orders.end()) {
276 return false;
277 }
278
279 std::vector<int> searchProperties = {
280 PBAP_SEARCH_PROPERTY_NAME,
281 PBAP_SEARCH_PROPERTY_NUMBER,
282 PBAP_SEARCH_PROPERTY_SOUND
283 };
284 if (std::find(searchProperties.begin(), searchProperties.end(), searchProperty_) == searchProperties.end()) {
285 return false;
286 }
287
288 if ((vCardSelectorOp_ != PBAP_SELECTOR_OPERATOR_OR) && (vCardSelectorOp_ != PBAP_SELECTOR_OPERATOR_AND)) {
289 return false;
290 }
291 return true;
292 }
293
GetName() const294 std::u16string IPbapPullvCardListingParam::GetName() const
295 {
296 return name_;
297 }
298
SetName(const std::u16string & name)299 void IPbapPullvCardListingParam::SetName(const std::u16string &name)
300 {
301 name_ = name;
302 specifiedBitset_ |= NAME;
303 }
304
GetOrder() const305 uint8_t IPbapPullvCardListingParam::GetOrder() const
306 {
307 return order_;
308 }
309
SetOrder(uint8_t order)310 void IPbapPullvCardListingParam::SetOrder(uint8_t order)
311 {
312 order_ = order;
313 specifiedBitset_ |= ORDER;
314 }
315
GetSearchValue() const316 std::string IPbapPullvCardListingParam::GetSearchValue() const
317 {
318 return searchValue_;
319 }
320
SetSearchValue(const std::string & searchValue)321 void IPbapPullvCardListingParam::SetSearchValue(const std::string &searchValue)
322 {
323 searchValue_ = searchValue;
324 specifiedBitset_ |= SEARCH_VALUE;
325 }
326
GetSearchProperty() const327 uint8_t IPbapPullvCardListingParam::GetSearchProperty() const
328 {
329 return searchProperty_;
330 }
331
SetSearchProperty(uint8_t searchProperty)332 void IPbapPullvCardListingParam::SetSearchProperty(uint8_t searchProperty)
333 {
334 searchProperty_ = searchProperty;
335 specifiedBitset_ |= SEARCH_PROPERTY;
336 }
337
GetMaxListCount() const338 uint16_t IPbapPullvCardListingParam::GetMaxListCount() const
339 {
340 return maxListCount_;
341 }
342
SetMaxListCount(uint16_t maxListCount)343 void IPbapPullvCardListingParam::SetMaxListCount(uint16_t maxListCount)
344 {
345 maxListCount_ = maxListCount;
346 specifiedBitset_ |= MAX_LIST_COUNT;
347 }
348
GetListStartOffset() const349 uint16_t IPbapPullvCardListingParam::GetListStartOffset() const
350 {
351 return listStartOffset_;
352 }
353
SetListStartOffset(uint16_t listStartOffset)354 void IPbapPullvCardListingParam::SetListStartOffset(uint16_t listStartOffset)
355 {
356 listStartOffset_ = listStartOffset;
357 specifiedBitset_ |= LIST_START_OFFSET;
358 }
359
GetResetNewMissedCalls() const360 uint8_t IPbapPullvCardListingParam::GetResetNewMissedCalls() const
361 {
362 return resetNewMissedCalls_;
363 }
364
SetResetNewMissedCalls(uint8_t resetNewMissedCalls)365 void IPbapPullvCardListingParam::SetResetNewMissedCalls(uint8_t resetNewMissedCalls)
366 {
367 resetNewMissedCalls_ = resetNewMissedCalls;
368 specifiedBitset_ |= RESET_NEW_MISSED_CALLS;
369 }
370
GetvCardSelector() const371 uint64_t IPbapPullvCardListingParam::GetvCardSelector() const
372 {
373 return vCardSelector_;
374 }
375
SetvCardSelector(uint64_t vCardSelector)376 void IPbapPullvCardListingParam::SetvCardSelector(uint64_t vCardSelector)
377 {
378 vCardSelector_ = vCardSelector;
379 specifiedBitset_ |= VCARD_SELECTOR;
380 }
381
GetvCardSelectorOp() const382 uint8_t IPbapPullvCardListingParam::GetvCardSelectorOp() const
383 {
384 return vCardSelectorOp_;
385 }
386
SetvCardSelectorOp(uint8_t vCardSelectorOp)387 void IPbapPullvCardListingParam::SetvCardSelectorOp(uint8_t vCardSelectorOp)
388 {
389 vCardSelectorOp_ = vCardSelectorOp;
390 specifiedBitset_ |= VCARD_SELECTOROP;
391 }
392
GetSpecifiedBitset() const393 uint64_t IPbapPullvCardListingParam::GetSpecifiedBitset() const
394 {
395 return specifiedBitset_;
396 }
397
SetSpecifiedBitset(uint64_t specifiedBitset)398 void IPbapPullvCardListingParam::SetSpecifiedBitset(uint64_t specifiedBitset)
399 {
400 specifiedBitset_ = specifiedBitset;
401 }
402
IsSpecified(int bitSpecified) const403 bool IPbapPullvCardListingParam::IsSpecified(int bitSpecified) const
404 {
405 if (bitSpecified & specifiedBitset_) {
406 return true;
407 } else {
408 return false;
409 }
410 }
411
412 // IPbapPullvCardEntryParam
IPbapPullvCardEntryParam()413 IPbapPullvCardEntryParam::IPbapPullvCardEntryParam()
414 : name_(u""), propertySelector_(0), format_(0), specifiedBitset_(0ULL)
415 {}
416
~IPbapPullvCardEntryParam()417 IPbapPullvCardEntryParam::~IPbapPullvCardEntryParam()
418 {}
419
IPbapPullvCardEntryParam(const IPbapPullvCardEntryParam & other)420 IPbapPullvCardEntryParam::IPbapPullvCardEntryParam(const IPbapPullvCardEntryParam &other)
421 : name_(other.name_),
422 propertySelector_(other.propertySelector_),
423 format_(other.format_),
424 specifiedBitset_(other.specifiedBitset_)
425 {}
426
ToDebugString() const427 std::string IPbapPullvCardEntryParam::ToDebugString() const
428 {
429 std::stringstream ss;
430 ss << "IPbapPullvCardEntryParam:" << std::endl;
431 std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter;
432 ss << "name:" << converter.to_bytes(GetName())
433 << std::endl;
434 if (IsSpecified(IPbapPullvCardEntryParam::PROPERTY_SELECTOR)) {
435 ss << "propertySelector:" << GetPropertySelector() << std::endl;
436 }
437 if (IsSpecified(IPbapPullvCardEntryParam::FORMAT)) {
438 ss << "format:" << (int)GetFormat() << std::endl;
439 }
440 return ss.str();
441 }
442
Validate() const443 bool IPbapPullvCardEntryParam::Validate() const
444 {
445 if ((format_ != PBAP_FORMAT_VCARD2_1) && (format_ != PBAP_FORMAT_VCARD3_0)) {
446 return false;
447 }
448
449 return true;
450 }
451
GetName() const452 std::u16string IPbapPullvCardEntryParam::GetName() const
453 {
454 return name_;
455 }
456
SetName(const std::u16string & name)457 void IPbapPullvCardEntryParam::SetName(const std::u16string &name)
458 {
459 name_ = name;
460 specifiedBitset_ |= NAME;
461 }
462
GetPropertySelector() const463 uint64_t IPbapPullvCardEntryParam::GetPropertySelector() const
464 {
465 return propertySelector_;
466 }
467
SetPropertySelector(uint64_t propertySelector)468 void IPbapPullvCardEntryParam::SetPropertySelector(uint64_t propertySelector)
469 {
470 propertySelector_ = propertySelector;
471 specifiedBitset_ |= PROPERTY_SELECTOR;
472 }
473
GetFormat() const474 uint8_t IPbapPullvCardEntryParam::GetFormat() const
475 {
476 return format_;
477 }
478
SetFormat(uint8_t format)479 void IPbapPullvCardEntryParam::SetFormat(uint8_t format)
480 {
481 format_ = format;
482 specifiedBitset_ |= FORMAT;
483 }
484
GetSpecifiedBitset() const485 uint64_t IPbapPullvCardEntryParam::GetSpecifiedBitset() const
486 {
487 return specifiedBitset_;
488 }
489
SetSpecifiedBitset(uint64_t specifiedBitset)490 void IPbapPullvCardEntryParam::SetSpecifiedBitset(uint64_t specifiedBitset)
491 {
492 specifiedBitset_ = specifiedBitset;
493 }
494
IsSpecified(int bitSpecified) const495 bool IPbapPullvCardEntryParam::IsSpecified(int bitSpecified) const
496 {
497 if (bitSpecified & specifiedBitset_) {
498 return true;
499 } else {
500 return false;
501 }
502 }
503
504 // IPbapPhoneBookData
IPbapPhoneBookData()505 IPbapPhoneBookData::IPbapPhoneBookData()
506 : phoneBookSize_(0),
507 primaryFolderVersion_(),
508 secondaryFolderVersion_(),
509 databaseIdentifier_(),
510 deviceAddr_(""),
511 vcardPath_(""),
512 vcardFileName_(""),
513 resultLoaded_(1),
514 result_()
515 {}
516
~IPbapPhoneBookData()517 IPbapPhoneBookData::~IPbapPhoneBookData()
518 {}
519
IPbapPhoneBookData(const IPbapPhoneBookData & other)520 IPbapPhoneBookData::IPbapPhoneBookData(const IPbapPhoneBookData &other)
521 : phoneBookSize_(other.phoneBookSize_),
522 primaryFolderVersion_(other.primaryFolderVersion_),
523 secondaryFolderVersion_(other.secondaryFolderVersion_),
524 databaseIdentifier_(other.databaseIdentifier_),
525 deviceAddr_(other.deviceAddr_),
526 vcardPath_(other.vcardPath_),
527 vcardFileName_(other.vcardFileName_),
528 resultLoaded_(other.resultLoaded_),
529 result_(other.result_)
530 {}
531
Load(std::vector<uint8_t> & retResult)532 void IPbapPhoneBookData::Load(std::vector<uint8_t> &retResult)
533 {
534 std::string fileName = deviceAddr_ + vcardPath_ + vcardFileName_;
535 std::ifstream ifs(fileName, std::ios::in | std::ios::binary);
536 if (!ifs.is_open() || resultLoaded_ == 1) {
537 return;
538 } else {
539 retResult.clear();
540 retResult.assign((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
541 resultLoaded_ = 1;
542 ifs.close();
543 remove(fileName.c_str());
544 }
545 return;
546 }
547 } // namespace bluetooth