Important:
This is retired content. This content is outdated and is no longer being maintained. It is provided as a courtesy for individuals who are still using these technologies. This content may contain URLs that were valid when originally published, but now link to sites or pages that no longer exist.
A version of this page is also available for
4/8/2010

The following procedure converts binary service data into ISdpRecordbuffer and retrieves the RFCOMM channel identifier by using ISdpNodeContainermethods.

For information about SDP record parsing, and the implementation of the ServiceAndAttributeSearchParse function, see Parsing an SDP Record Using COM Interfaces.

Copy Code
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
			#ifdef UNDER_NT
			LPSTR	 lpCmdLine,
			#else
			LPWSTR	lpCmdLine,
			#endif
			int nCmdShow)
{
  ISdpRecord **pRecordArg;
  ISdpRecord *pRecord = NULL;
  ULONG ulRecords = 0;
  ULONG i,j,k;
  ULONG  ulChannelId = 0;
  BOOL   fSuccess = FALSE;
  CoInitializeEx(NULL,COINIT_MULTITHREADED);
	// Note: in real scenarios szBuf will be results from
WSALookupServiceNext after
	// performing a ServiceAttribute search.
  if (ERROR_SUCCESS !=
ServiceAndAttributeSearchParse(szBuf,sizeof(szBuf),&pRecordArg,&ulRecords))
  goto done;
  for (i = 0; i < ulRecords; i++) 
{
  pRecord = pRecordArg[i]; // Particular record to examine in
this loop.
  CNodeDataFreeString protocolList;
  // Contains SDP_ATTRIB_PROTOCOL_DESCRIPTOR_LIST data, if
available.
  if (ERROR_SUCCESS !=
pRecord->GetAttribute(SDP_ATTRIB_PROTOCOL_DESCRIPTOR_LIST,&protocolList)
||
  (protocolList.type != SDP_TYPE_CONTAINER))
  {
	continue;
  }
  ISdpNodeContainer *pRecordContainer = protocolList.u.container;
  DWORD cProtocols = 0;
  NodeData protocolDescriptor; // Information about a specific
protocol. (i.e. L2CAP, RFCOMM, ...)
  pRecordContainer->GetNodeCount(&cProtocols);
  for (j = 0; j < cProtocols; j++) 
  {
	pRecordContainer->GetNode(j,&protocolDescriptor);
	if (protocolDescriptor.type != SDP_TYPE_CONTAINER)
	continue;
	ISdpNodeContainer *pProtocolContainer =
protocolDescriptor.u.container;
	DWORD cProtocolAtoms;
	pProtocolContainer->GetNodeCount(&cProtocolAtoms);
	for (k = 0; k < cProtocolAtoms; k++) 
	{
// Individual data element, such as what protocol this is or
RFCOMM. channel id.
	NodeData nodeAtom;  
	pProtocolContainer->GetNode(k,&nodeAtom);
	if (IsRfcommUuid(&nodeAtom))  
	{
		if (k+1 == cProtocolAtoms) 
		{
// Misformatted response.  Channel ID should follow RFCOMM uuid.
		break;
	}
		NodeData channelID;
		pProtocolContainer->GetNode(k+1,&channelID);
		if (GetChannel(&channelID,&ulChannelId)) 
		{
		fSuccess = TRUE;
		goto done;
	}
		break; // Formatting error.
}
}
  }
}
done:
  for (i = 0; i < ulRecords; i++) 
  pRecordArg[i]->Release();
  CoTaskMemFree(pRecordArg);
  CoUninitialize();
return 0;
}

See Also