Add tag for the 120219 release.
[pub/USBasp.git] / Demos / Host / Incomplete / BluetoothHost / Lib / SDPServices.c
index 28b9d77..1170121 100644 (file)
-/*\r
-             LUFA Library\r
-     Copyright (C) Dean Camera, 2010.\r
-              \r
-  dean [at] fourwalledcubicle [dot] com\r
-      www.fourwalledcubicle.com\r
-*/\r
-\r
-/*\r
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
-  Permission to use, copy, modify, distribute, and sell this \r
-  software and its documentation for any purpose is hereby granted\r
-  without fee, provided that the above copyright notice appear in \r
-  all copies and that both that the copyright notice and this\r
-  permission notice and warranty disclaimer appear in supporting \r
-  documentation, and that the name of the author not be used in \r
-  advertising or publicity pertaining to distribution of the \r
-  software without specific, written prior permission.\r
-\r
-  The author disclaim all warranties with regard to this\r
-  software, including all implied warranties of merchantability\r
-  and fitness.  In no event shall the author be liable for any\r
-  special, indirect or consequential damages or any damages\r
-  whatsoever resulting from loss of use, data or profits, whether\r
-  in an action of contract, negligence or other tortious action,\r
-  arising out of or in connection with the use or performance of\r
-  this software.\r
-*/\r
-\r
-#include "SDPServices.h"\r
-\r
-const struct\r
-{\r
-       uint8_t  Header;\r
-       uint32_t Data;\r
-} PROGMEM SDP_Attribute_ServiceHandle =\r
-       {\r
-               (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_32Bit),\r
-               SWAPENDIAN_32(0x00010000),\r
-       };\r
-\r
-const struct\r
-{\r
-       uint8_t    Header;\r
-       uint16_t   Size;\r
-       ItemUUID_t UUIDList[];\r
-} PROGMEM SDP_Attribute_ServiceClassIDs =\r
-       {\r
-               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
-               SWAPENDIAN_16(sizeof(ItemUUID_t) * 1),\r
-               {\r
-                       {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x10, 0x00}}}\r
-               }\r
-       };\r
-\r
-const struct\r
-{\r
-       uint8_t        Header;\r
-       uint16_t       Size;\r
-       ItemProtocol_t ProtocolList[];\r
-} PROGMEM SDP_Attribute_ProtocolDescriptor =\r
-       {\r
-               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
-               SWAPENDIAN_16(sizeof(ItemProtocol_t) * 1),\r
-               {\r
-                       {\r
-                               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
-                               sizeof(UUID_t),\r
-                               {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x01, 0x00}}},\r
-                       }\r
-               }\r
-       };\r
-\r
-const struct\r
-{\r
-       uint8_t     Header;\r
-       uint8_t     Size;\r
-       Item16Bit_t VersionList[];\r
-} PROGMEM SDP_Attribute_Version =\r
-       {\r
-               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
-               (sizeof(Item16Bit_t) * 1),\r
-               {\r
-                       {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), SWAPENDIAN_16(0x0100)}\r
-               }\r
-       };\r
-\r
-const struct\r
-{\r
-       uint8_t Header;\r
-       uint8_t Size;\r
-       char    Text[];\r
-} PROGMEM SDP_Attribute_ServiceName =\r
-       {\r
-               (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),\r
-               (sizeof("SDP") - 1),\r
-               "SDP",\r
-       };\r
-\r
-const struct\r
-{\r
-       uint8_t Header;\r
-       uint8_t Size;\r
-       char    Text[];\r
-} PROGMEM SDP_Attribute_ServiceDescription =\r
-       {\r
-               (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),\r
-               (sizeof("Service Discovery Protocol Server") - 1),\r
-               "Service Discovery Protocol Server",\r
-       };\r
-\r
-/** Service Discovery Protocol attribute table, listing all supported attributes of the service. */\r
-const ServiceAttributeTable_t SDP_Attribute_Table[] PROGMEM =\r
-       {\r
-               {.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE,    .Data = &SDP_Attribute_ServiceHandle      },\r
-               {.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS,        .Data = &SDP_Attribute_ServiceClassIDs    },\r
-//             {.AttributeID = SDP_ATTRIBUTE_ID_PROTOCOLDESCRIPTORLIST, .Data = &SDP_Attribute_ProtocolDescriptor },\r
-               {.AttributeID = SDP_ATTRIBUTE_ID_VERSION,                .Data = &SDP_Attribute_Version            },\r
-               {.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME,            .Data = &SDP_Attribute_ServiceName        },\r
-               {.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION,     .Data = &SDP_Attribute_ServiceDescription },\r
-\r
-               SERVICE_ATTRIBUTE_TABLE_TERMINATOR\r
-       };\r
-\r
-const struct\r
-{\r
-       uint8_t  Header;\r
-       uint32_t Data;\r
-} PROGMEM RFCOMM_Attribute_ServiceHandle =\r
-       {\r
-               (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_32Bit),\r
-               SWAPENDIAN_32(0x00010001),\r
-       };\r
-\r
-const struct\r
-{\r
-       uint8_t    Header;\r
-       uint16_t   Size;\r
-       ItemUUID_t UUIDList[];\r
-} PROGMEM RFCOMM_Attribute_ServiceClassIDs =\r
-       {\r
-               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
-               SWAPENDIAN_16(sizeof(ItemUUID_t) * 1),\r
-               {\r
-                       {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x11, 0x01}}}\r
-               }\r
-       };\r
-\r
-const struct\r
-{\r
-       uint8_t     Header;\r
-       uint8_t     Size;\r
-       Item16Bit_t OffsetList[];\r
-} PROGMEM RFCOMM_Attribute_LangOffset =\r
-       {\r
-               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
-               (sizeof(Item16Bit_t) * 1),\r
-               {\r
-                       {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), SWAPENDIAN_16(0x0100)}\r
-               }\r
-       };\r
-\r
-const struct\r
-{\r
-       uint8_t Header;\r
-       uint8_t Size;\r
-       char    Text[];\r
-} PROGMEM RFCOMM_Attribute_ServiceName =\r
-       {\r
-               (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),\r
-               sizeof("Serial Port") - 1,\r
-               "Serial Port",\r
-       };\r
-\r
-const struct\r
-{\r
-       uint8_t Header;\r
-       uint8_t Size;\r
-       char    Text[];\r
-} PROGMEM RFCOMM_Attribute_ServiceDescription =\r
-       {\r
-               (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),\r
-               sizeof("Wireless Serial Port Service") - 1,\r
-               "Wireless Serial Port Service",\r
-       };\r
-\r
-const ServiceAttributeTable_t RFCOMM_Attribute_Table[] PROGMEM =\r
-       {\r
-               {.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE,    .Data = &RFCOMM_Attribute_ServiceHandle      },\r
-               {.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS,        .Data = &RFCOMM_Attribute_ServiceClassIDs    },\r
-               {.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME,            .Data = &RFCOMM_Attribute_ServiceName        },\r
-               {.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION,     .Data = &RFCOMM_Attribute_ServiceDescription },\r
-\r
-               SERVICE_ATTRIBUTE_TABLE_TERMINATOR\r
-       };\r
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2012.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaim all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *
+ *  SDP Service Attribute definitions. This file contains the attributes
+ *  and attribute tables of all the services the device supports, which can
+ *  then be retrieved by a connected Bluetooth device via the SDP server.
+ */
+
+#include "SDPServices.h"
+
+/** Serial Port Profile attribute, listing the unique service handle of the Serial Port service
+ *  within the device. This handle can then be requested by the SDP client in future transactions
+ *  in lieu of a search UUID list.
+ */
+const struct
+{
+       uint8_t  Header;
+       uint32_t Data;
+} PROGMEM SerialPort_Attribute_ServiceHandle =
+       {
+               (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_32Bit),
+               SWAPENDIAN_32(0x00010001),
+       };
+
+/** Serial Port Profile attribute, listing the implemented Service Class UUIDs of the Serial Port service
+ *  within the device. This list indicates all the class UUIDs that apply to the Serial Port service, so that
+ *  a SDP client can search by a generalized class rather than a specific UUID to determine supported services.
+ */
+const struct
+{
+       uint8_t    Header;
+       uint8_t    Size;
+       ItemUUID_t UUIDList[];
+} PROGMEM SerialPort_Attribute_ServiceClassIDs =
+       {
+               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
+               (sizeof(ItemUUID_t) * 1),
+               {
+                       {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), SP_CLASS_UUID},
+               },
+       };
+
+/** Serial Port Profile attribute, listing the Protocols (and their attributes) of the Serial Port service
+ *  within the device. This list indicates what protocols the service is layered on top of, as well as any
+ *  configuration information for each layer.
+ */
+const struct
+{
+       uint8_t                  Header;
+       uint8_t                  Size;
+
+       ItemProtocol_t           L2CAP;
+       ItemProtocol_8BitParam_t RFCOMM;
+} PROGMEM SerialPort_Attribute_ProtocolDescriptor =
+       {
+               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
+               (sizeof(ItemProtocol_t) + sizeof(ItemProtocol_8BitParam_t)),
+               {
+                       (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
+                       sizeof(ItemUUID_t),
+                       {
+                               {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), L2CAP_UUID},
+                       },
+               },
+               {
+                       (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
+                       (sizeof(ItemUUID_t) + sizeof(Item8Bit_t)),
+                       {
+                               {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), RFCOMM_UUID},
+                               {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_8Bit), 0x03},
+                       },
+               },
+       };
+
+/** Serial Port Profile attribute, listing the Browse Group List UUIDs which this service is a member of.
+ *  Browse Group UUIDs give a way to group together services within a device in a simple hierarchy, so that
+ *  a SDP client can progressively narrow down an general browse to a specific service which it requires.
+ */
+const struct
+{
+       uint8_t    Header;
+       uint8_t    Size;
+       ItemUUID_t UUIDList[];
+} PROGMEM SerialPort_Attribute_BrowseGroupList =
+       {
+               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
+               (sizeof(ItemUUID_t) * 1),
+               {
+                       {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), PUBLICBROWSEGROUP_CLASS_UUID},
+               },
+       };
+
+/** Serial Port Profile attribute, listing the languages (and their encodings) supported
+ *  by the Serial Port service in its text string attributes.
+ */
+const struct
+{
+       uint8_t            Header;
+       uint8_t            Size;
+       ItemLangEncoding_t LanguageEncodings[];
+} PROGMEM SerialPort_Attribute_LanguageBaseIDOffset =
+       {
+               (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
+               (sizeof(ItemLangEncoding_t) * 1),
+               {
+                       {
+                               {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), SWAPENDIAN_16(0x454E)},
+                               {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), SWAPENDIAN_16(0x006A)},
+                               {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), SWAPENDIAN_16(0x0100)},
+                       },
+               },
+       };
+
+/** Serial Port Profile attribute, listing a human readable name of the service. */
+const struct
+{
+       uint8_t Header;
+       uint8_t Size;
+       char    Text[];
+} PROGMEM SerialPort_Attribute_ServiceName =
+       {
+               (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
+               sizeof("Wireless Serial Port") - 1,
+               "Wireless Serial Port",
+       };
+
+/** Serial Port Profile attribute, listing a human readable description of the service. */
+const struct
+{
+       uint8_t Header;
+       uint8_t Size;
+       char    Text[];
+} PROGMEM SerialPort_Attribute_ServiceDescription =
+       {
+               (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
+               sizeof("Wireless Serial Port Service") - 1,
+               "Wireless Serial Port Service",
+       };
+
+/** Service Attribute Table for the Serial Port service, linking each supported attribute ID to its data, so that
+ *  the SDP server can retrieve it for transmission back to a SDP client upon request.
+ */
+const ServiceAttributeTable_t PROGMEM SerialPort_Attribute_Table[] =
+       {
+               {.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE,    .Data = &SerialPort_Attribute_ServiceHandle       },
+               {.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS,        .Data = &SerialPort_Attribute_ServiceClassIDs     },
+               {.AttributeID = SDP_ATTRIBUTE_ID_PROTOCOLDESCRIPTORLIST, .Data = &SerialPort_Attribute_ProtocolDescriptor  },
+               {.AttributeID = SDP_ATTRIBUTE_ID_BROWSEGROUPLIST,        .Data = &SerialPort_Attribute_BrowseGroupList     },
+               {.AttributeID = SDP_ATTRIBUTE_ID_LANGUAGEBASEATTROFFSET, .Data = &SerialPort_Attribute_LanguageBaseIDOffset},
+               {.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME,            .Data = &SerialPort_Attribute_ServiceName         },
+               {.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION,     .Data = &SerialPort_Attribute_ServiceDescription  },
+
+               SERVICE_ATTRIBUTE_TABLE_TERMINATOR
+       };
+