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; } |