• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <bluetooth/log.h>
20 
21 #include <iomanip>
22 #include <iostream>
23 #include <sstream>
24 #include <string>
25 #include <type_traits>
26 
27 #include "internal_include/bt_trace.h"
28 #include "macros.h"
29 #include "sdp_common.h"
30 
31 namespace bluetooth {
32 namespace sdp {
33 
PduIdText(const PduId & id)34 inline std::string PduIdText(const PduId& id) {
35   switch (id) {
36     CASE_RETURN_TEXT(PduId::RESERVED);
37     CASE_RETURN_TEXT(PduId::ERROR);
38     CASE_RETURN_TEXT(PduId::SERVICE_SEARCH_REQUEST);
39     CASE_RETURN_TEXT(PduId::SERVICE_SEARCH_RESPONSE);
40     CASE_RETURN_TEXT(PduId::SERVICE_ATTRIBUTE_REQUEST);
41     CASE_RETURN_TEXT(PduId::SERVICE_ATTRIBUTE_RESPONSE);
42     CASE_RETURN_TEXT(PduId::SERVICE_SEARCH_ATTRIBUTE_REQUEST);
43     CASE_RETURN_TEXT(PduId::SERVICE_SEARCH_ATTRIBUTE_RESPONSE);
44     default:
45       return "Unknown PduId: " + loghex((uint8_t)id);
46   }
47 }
48 
49 inline std::ostream& operator<<(std::ostream& os, const PduId& id) {
50   return os << PduIdText(id);
51 }
52 
AttributeIdText(const AttributeId & id)53 inline std::string AttributeIdText(const AttributeId& id) {
54   switch (id) {
55     CASE_RETURN_TEXT(AttributeId::SERVICE_RECORD_HANDLE);
56     CASE_RETURN_TEXT(AttributeId::SERVICE_CLASS_ID_LIST);
57     CASE_RETURN_TEXT(AttributeId::SERVICE_RECORD_STATE);
58     CASE_RETURN_TEXT(AttributeId::SERVICE_ID);
59     CASE_RETURN_TEXT(AttributeId::PROTOCOL_DESCRIPTOR_LIST);
60     CASE_RETURN_TEXT(AttributeId::BROWSE_GROUP_LIST);
61     CASE_RETURN_TEXT(AttributeId::LANGUAGE_BASE_ATTRIBUTE_ID_LIST);
62     CASE_RETURN_TEXT(AttributeId::SERVICE_INFO_TIME_TO_LIVE);
63     CASE_RETURN_TEXT(AttributeId::SERVICE_AVAILABILITY);
64     CASE_RETURN_TEXT(AttributeId::PROFILE_DESCRIPTOR_LIST);
65     CASE_RETURN_TEXT(AttributeId::DOCUMENTATION_URL);
66     CASE_RETURN_TEXT(AttributeId::CLIENT_EXECUTABLE_URL);
67     CASE_RETURN_TEXT(AttributeId::ICON_URL);
68     CASE_RETURN_TEXT(AttributeId::ADDITIONAL_PROTOCOL_DESCRIPTOR_LIST);
69     CASE_RETURN_TEXT(AttributeId::VERSION_NUMBER_LIST);
70     CASE_RETURN_TEXT(AttributeId::SERVICE_DATABASE_STATE);
71     default:
72       return "Unknown AttributeId: " + loghex((uint16_t)id);
73   }
74 }
75 
76 inline std::ostream& operator<<(std::ostream& os, const AttributeId& id) {
77   return os << AttributeIdText(id);
78 }
79 
DataElementTypeText(const DataElementType & type)80 inline std::string DataElementTypeText(const DataElementType& type) {
81   switch (type) {
82     CASE_RETURN_TEXT(DataElementType::NIL);
83     CASE_RETURN_TEXT(DataElementType::UNSIGNED_INT);
84     CASE_RETURN_TEXT(DataElementType::SIGNED_INT);
85     CASE_RETURN_TEXT(DataElementType::UUID);
86     CASE_RETURN_TEXT(DataElementType::STRING);
87     CASE_RETURN_TEXT(DataElementType::BOOLEAN);
88     CASE_RETURN_TEXT(DataElementType::DATA_ELEMENT_SEQUENCE);
89     CASE_RETURN_TEXT(DataElementType::DATA_ELEMENT_ALTERNATIVE);
90     CASE_RETURN_TEXT(DataElementType::URL);
91     default:
92       return "Unknown DataElementType: " + loghex((uint8_t)type);
93   }
94 }
95 
96 inline std::ostream& operator<<(std::ostream& os, const DataElementType& type) {
97   return os << DataElementTypeText(type);
98 }
99 
DataElementSizeText(const DataElementSize & size)100 inline std::string DataElementSizeText(const DataElementSize& size) {
101   switch (size) {
102     CASE_RETURN_TEXT(DataElementSize::BYTE1);
103     CASE_RETURN_TEXT(DataElementSize::BYTE2);
104     CASE_RETURN_TEXT(DataElementSize::BYTE4);
105     CASE_RETURN_TEXT(DataElementSize::BYTE8);
106     CASE_RETURN_TEXT(DataElementSize::BYTE16);
107     CASE_RETURN_TEXT(DataElementSize::ADDITIONAL_8BIT);
108     CASE_RETURN_TEXT(DataElementSize::ADDITIONAL_16BIT);
109     CASE_RETURN_TEXT(DataElementSize::ADDITIONAL_32BIT);
110     default:
111       return "Unknown DataElementSize: " + loghex((uint8_t)size);
112   }
113 }
114 
115 inline std::ostream& operator<<(std::ostream& os, const DataElementSize& size) {
116   return os << DataElementSizeText(size);
117 }
118 
119 }  // namespace sdp
120 }  // namespace bluetooth
121 
122 namespace fmt {
123 template <>
124 struct formatter<bluetooth::sdp::PduId> : ostream_formatter {};
125 template <>
126 struct formatter<bluetooth::sdp::AttributeId> : ostream_formatter {};
127 template <>
128 struct formatter<bluetooth::sdp::DataElementType> : ostream_formatter {};
129 template <>
130 struct formatter<bluetooth::sdp::DataElementSize> : ostream_formatter {};
131 }  // namespace fmt
132