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)34inline 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)53inline 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)80inline 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)100inline 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