Bluetooth MAP profile - sms and mms support initial check-in
bug:10116530
Change-Id: I3bff487fdc0ee1256afa8d704a2cfa788081208c
diff --git a/btif/include/btif_sock_sdp.h b/btif/include/btif_sock_sdp.h
index 9fe4768..0028b50 100644
--- a/btif/include/btif_sock_sdp.h
+++ b/btif/include/btif_sock_sdp.h
@@ -22,6 +22,8 @@
0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
static const UINT8 UUID_PBAP_PSE[] = {0x00, 0x00, 0x11, 0x2F, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
+static const UINT8 UUID_MAPS_MAS[] = {0x00, 0x00, 0x11, 0x32, 0x00, 0x00, 0x10, 0x00,
+ 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
static const UINT8 UUID_SPP[] = {0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
diff --git a/btif/src/btif_sock_sdp.c b/btif/src/btif_sock_sdp.c
index a1ec6df..93809cd 100644
--- a/btif/src/btif_sock_sdp.c
+++ b/btif/src/btif_sock_sdp.c
@@ -211,6 +211,112 @@
return sdp_handle;
}
+/* This is horrible design - to reserve channel ID's and use them to magically link
+ * a channel number to a hard coded SDP entry.
+ * TODO: expose a prober SDP API, to avoid hacks like this, and make it possible
+ * to set useful names for the ServiceName */
+#define BTA_MAP_MSG_TYPE_EMAIL 0x01
+#define BTA_MAP_MSG_TYPE_SMS_GSM 0x02
+#define BTA_MAP_MSG_TYPE_SMS_CDMA 0x04
+#define BTA_MAP_MSG_TYPE_MMS 0x08
+
+#define BTA_MAPS_DEFAULT_VERSION 0x0100
+typedef struct
+{
+ UINT8 mas_id; /* the MAS instance id */
+ const char* service_name; /* Description of the MAS instance */
+ UINT8 supported_message_types; /* Server supported message types - SMS/MMS/EMAIL */
+} tBTA_MAPS_CFG;
+const tBTA_MAPS_CFG bta_maps_cfg_sms_mms =
+{
+ 0, /* Mas id 0 is for SMS/MMS */
+ "MAP SMS/MMS",
+ BTA_MAP_MSG_TYPE_SMS_GSM | BTA_MAP_MSG_TYPE_SMS_CDMA | BTA_MAP_MSG_TYPE_MMS
+};
+const tBTA_MAPS_CFG bta_maps_cfg_email =
+{
+ 1, /* Mas id 1 is for EMAIL */
+ "MAP EMAIL",
+ BTA_MAP_MSG_TYPE_EMAIL
+};
+static int add_maps_sdp(const char* p_service_name, int scn)
+{
+
+ tSDP_PROTOCOL_ELEM protoList [3];
+ UINT16 service = UUID_SERVCLASS_MESSAGE_ACCESS;
+ UINT16 browse = UUID_SERVCLASS_PUBLIC_BROWSE_GROUP;
+ BOOLEAN status = FALSE;
+ UINT32 sdp_handle = 0;
+ // TODO: To add support for EMAIL set below depending on the scn to either SMS or Email
+ const tBTA_MAPS_CFG *p_bta_maps_cfg = &bta_maps_cfg_sms_mms;
+
+ APPL_TRACE_DEBUG2("add_maps_sdd:scn %d, service name %s", scn, p_service_name);
+
+ if ((sdp_handle = SDP_CreateRecord()) == 0)
+ {
+ APPL_TRACE_ERROR0("MAPS SDP: Unable to register MAPS Service");
+ return sdp_handle;
+ }
+
+ /* add service class */
+ if (SDP_AddServiceClassIdList(sdp_handle, 1, &service))
+ {
+ memset( protoList, 0 , 3*sizeof(tSDP_PROTOCOL_ELEM) );
+ /* add protocol list, including RFCOMM scn */
+ protoList[0].protocol_uuid = UUID_PROTOCOL_L2CAP;
+ protoList[0].num_params = 0;
+ protoList[1].protocol_uuid = UUID_PROTOCOL_RFCOMM;
+ protoList[1].num_params = 1;
+ protoList[1].params[0] = scn;
+ protoList[2].protocol_uuid = UUID_PROTOCOL_OBEX;
+ protoList[2].num_params = 0;
+
+ if (SDP_AddProtocolList(sdp_handle, 3, protoList))
+ {
+ status = TRUE; /* All mandatory fields were successful */
+
+ /* optional: if name is not "", add a name entry */
+ SDP_AddAttribute(sdp_handle,
+ (UINT16)ATTR_ID_SERVICE_NAME,
+ (UINT8)TEXT_STR_DESC_TYPE,
+ (UINT32)(strlen(p_bta_maps_cfg->service_name) + 1),
+ (UINT8 *)p_bta_maps_cfg->service_name);
+
+ /* Add in the Bluetooth Profile Descriptor List */
+ SDP_AddProfileDescriptorList(sdp_handle,
+ UUID_SERVCLASS_MAP_PROFILE,
+ BTA_MAPS_DEFAULT_VERSION);
+
+ } /* end of setting mandatory protocol list */
+ } /* end of setting mandatory service class */
+
+ /* add supported feature and repositories */
+ if (status)
+ {
+ SDP_AddAttribute(sdp_handle, ATTR_ID_MAS_INSTANCE_ID, UINT_DESC_TYPE,
+ (UINT32)1, (UINT8*)&p_bta_maps_cfg->mas_id);
+ SDP_AddAttribute(sdp_handle, ATTR_ID_SUPPORTED_MSG_TYPE, UINT_DESC_TYPE,
+ (UINT32)1, (UINT8*)&p_bta_maps_cfg->supported_message_types);
+
+ /* Make the service browseable */
+ SDP_AddUuidSequence (sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, &browse);
+ }
+
+ if (!status)
+ {
+ SDP_DeleteRecord(sdp_handle);
+ sdp_handle = 0;
+ APPL_TRACE_ERROR0("bta_mass_sdp_register FAILED");
+ }
+ else
+ {
+ bta_sys_add_uuid(service); /* UUID_SERVCLASS_MESSAGE_ACCESS */
+ APPL_TRACE_DEBUG1("MAPSS: SDP Registered (handle 0x%08x)", sdp_handle);
+ }
+
+ return sdp_handle;
+}
+
/* object format lookup table */
static const tBTA_OP_FMT bta_ops_obj_fmt[] =
@@ -378,6 +484,10 @@
{
handle = add_pbap_sdp(name, final_scn); //PBAP Server is always 19
}
+ else if (IS_UUID(UUID_MAPS_MAS,uuid))
+ {
+ handle = add_maps_sdp(name, final_scn); //PBAP Server is always 19
+ }
else if (IS_UUID(UUID_SPP, uuid))
{
handle = add_spp_sdp(name, final_scn);