예제 #1
0
void dumpBTevent(BTEVENT btEvent, HWND hwnd){
	BT_CONNECT_EVENT* cntEvt = NULL;
	BT_DISCONNECT_EVENT* discntEvt=NULL;
	BT_ROLE_SWITCH_EVENT* rolSwitchEvt=NULL;
	BT_MODE_CHANGE_EVENT* btModeChgEvt=NULL;
	BT_LINK_KEY_EVENT* btLnkKeyEvt=NULL;

	TCHAR btAddress[18];
	TCHAR hConn[12];
	TCHAR encMode[5];
	TCHAR linkType[5];
	TCHAR szTemp[MAX_PATH];
	TCHAR szMsg[MAX_PATH];

	wsprintf(szMsg, L"\r\n");

	switch (btEvent.dwEventId){
		case BTE_KEY_NOTIFY:
			wsprintf(szMsg, L"\r\n%s: BTE_KEY_NOTIFY:", logDateTime());
			break;
		case BTE_KEY_REVOKED:
			btLnkKeyEvt = (BT_LINK_KEY_EVENT*)btEvent.baEventData;
			//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
			wsprintf(btAddress, L"%s", btAddr2Mac( btLnkKeyEvt->bta, btAddress));
			wsprintf(szMsg, L"\r\n%s: BTE_KEY_REVOKED: mac=%s", logDateTime(), btAddress);
			break;
		case BTE_LOCAL_NAME:
			wsprintf(szMsg, L"\r\n%s: BTE_LOCAL_NAME:", logDateTime());
			break;
		case BTE_COD:			
			wsprintf(szMsg, L"\r\n%s: BTE_COD:", logDateTime());
			break;
		case BTE_STACK_UP:			
			wsprintf(szMsg, L"\r\n%s: BTE_STACK_UP:", logDateTime());
			break;
		case BTE_STACK_DOWN:
			wsprintf(szMsg,L"\r\n%s: BTE_STACK_DOWN:", logDateTime());
			break;
		case BTE_CONNECTION:
			cntEvt = (BT_CONNECT_EVENT*)btEvent.baEventData;
			btAddr2Mac(cntEvt->bta, btAddress);
			wsprintf(btAddress, L"%s", btAddress);// L"0x00 n/a");
			wsprintf(hConn, L"0x%08x", cntEvt->hConnection);
			wsprintf(encMode, L"0x%02x", cntEvt->ucEncryptMode);
			wsprintf(linkType, L"0x%02x", cntEvt->ucLinkType);
			wsprintf(szMsg, L"\r\n%s: BTE_CONNECTION: hnd=%s, mac=%s, enc=%s, lnk=%s",
				logDateTime(),
				hConn,
				btAddress,
				encMode,
				linkType);
			break;
		case BTE_PAGE_TIMEOUT:
			wsprintf(szMsg,L"\r\n%s: BTE_PAGE_TIMEOUT:", logDateTime());
			break;
		case BTE_MODE_CHANGE:
			btModeChgEvt = (BT_MODE_CHANGE_EVENT*)btEvent.baEventData;
			wsprintf(btAddress, L"%s", btAddr2Mac(btModeChgEvt->bta, btAddress));
			wsprintf(hConn, L"0x%08x", btModeChgEvt->hConnection);
			wsprintf(encMode, L"0x%02x", btModeChgEvt->bMode);
			wsprintf(szTemp, L"%i", btModeChgEvt->usInterval);
			wsprintf(szMsg, L"\r\n%s: BTE_MODE_CHANGE: cnt=%s, mac=%s, mod=%s, int=%s",
				logDateTime(),
				hConn,
				btAddress,
				encMode,
				szTemp);
			break;
		case BTE_ROLE_SWITCH:
			rolSwitchEvt = (BT_ROLE_SWITCH_EVENT*)btEvent.baEventData;
			wsprintf(btAddress, L"%s", btAddr2Mac(rolSwitchEvt->bta, btAddress));
			wsprintf(szTemp, L"0x%02x", rolSwitchEvt->fRole);
			wsprintf(szMsg, L"\r\n%s: BTE_ROLE_SWITCH: mac=%s, new role=%s",
				logDateTime(),
				btAddress, 
				szTemp);
			break;
		case BTE_DISCONNECTION:
			discntEvt = (BT_DISCONNECT_EVENT*)btEvent.baEventData;
			wsprintf(hConn, L"0x%08x", discntEvt->hConnection);
			wsprintf(szTemp, L"%i", discntEvt->ucReason);
			if( discntEvt->ucReason <= lastError)
				wsprintf(szTemp, L"'%s'", szBTerror[discntEvt->ucReason]);
			wsprintf(szMsg, L"\r\n%s: BTE_DISCONNECTION: hnd=%s, why=%s",
				logDateTime(),
				hConn, 
				szTemp);
			break;
		case BTE_CONNECTION_AUTH_FAILURE:
			wsprintf(szMsg, L"\r\n%s BTE_CONNECTION_AUTH_FAILURE", logDateTime());
			break;
		default:
			wsprintf(szMsg, L"\r\n%s: unknown BT event: %i", logDateTime(), btEvent.dwEventId);
			break;
	}//switch
	DEBUGMSG(1, (szMsg));
	nclog(szMsg);
	printMsg(szMsg, hwnd);
}
void bluetoothDiscovery(ConnectivityBluetooth *conn)
{
	//BOOL bHaveName;
	HANDLE hScan = INVALID_HANDLE_VALUE;
	WSAQUERYSET wsaq;
	BTHNS_INQUIRYBLOB queryBlob;
	queryBlob.LAP = BT_ADDR_GIAC;
	queryBlob.num_responses = 10;
	queryBlob.length = 12;
	BLOB blob;
	int count = 0;
	BthInquiryResult *p_inqRes;
	union {
		CHAR buf[4096];
		SOCKADDR_BTH __unused;
	};
	const BluetoothAddress *addr;

	blob.cbSize = sizeof(queryBlob);
	blob.pBlobData = (BYTE *) & queryBlob;

	ZeroMemory(&wsaq, sizeof(wsaq));
	wsaq.dwSize = sizeof(wsaq);
	wsaq.dwNameSpace = NS_BTH;
	wsaq.lpcsaBuffer = NULL;
	wsaq.lpBlob = &blob;
	
	addr = conn->rootInterface->getAddress<BluetoothAddress>();

	if (!addr)
		return;

	CM_DBG("Doing scan on device %s - %s\n", conn->rootInterface->getName(), addr->getStr());

	if (ERROR_SUCCESS != WSALookupServiceBegin(&wsaq, LUP_CONTAINERS, &hScan)) {
		CM_DBG("WSALookupServiceBegin failed\n");
		return;
	}
	// loop the results
	while (!conn->shouldExit()) {
		DWORD dwSize = sizeof(buf);
		LPWSAQUERYSET pwsaResults = (LPWSAQUERYSET) buf;
		ZeroMemory(pwsaResults, sizeof(WSAQUERYSET));
		pwsaResults->dwSize = sizeof(WSAQUERYSET);
		pwsaResults->dwNameSpace = NS_BTH;
		pwsaResults->lpBlob = NULL;
		unsigned char macaddr[BT_ALEN];
		string name = "bluetooth device";
		bool report_interface = false;
		InterfaceStatus_t status;

		if (WSALookupServiceNext(hScan, LUP_RETURN_NAME | LUP_RETURN_ADDR | LUP_RETURN_BLOB, 
			&dwSize, pwsaResults) != ERROR_SUCCESS) {
			CM_DBG("Found %d Haggle devices\n", count);
			break;
		}

		p_inqRes = (BthInquiryResult *) pwsaResults->lpBlob->pBlobData;

		BT_ADDR btAddr = ((SOCKADDR_BTH *) pwsaResults->lpcsaBuffer->RemoteAddr.lpSockaddr)->btAddr;

		if (pwsaResults->lpszServiceInstanceName && *(pwsaResults->lpszServiceInstanceName)) {
			int namelen = wcslen(pwsaResults->lpszServiceInstanceName) + 1;
			char *tmp = new char[namelen];
			wcstombs(tmp, pwsaResults->lpszServiceInstanceName, namelen);
			name.clear();
			name = tmp;
			delete[] tmp;
		}

		btAddr2Mac(btAddr, macaddr);
		BluetoothAddress addr(macaddr);

		status = conn->is_known_interface(Interface::TYPE_BLUETOOTH, macaddr);

		if (status == INTERFACE_STATUS_HAGGLE) {
			report_interface = true;
		} else if (status == INTERFACE_STATUS_UNKNOWN) {
			//int ret = DetectRFCommChannel(&btAddr);
			int ret = findHaggleService(&btAddr);
			
			if (ret > 0) {
				report_interface = true;
				conn->report_known_interface(Interface::TYPE_BLUETOOTH, macaddr, true);
			} else if (ret == 0) {
				conn->report_known_interface(Interface::TYPE_BLUETOOTH, macaddr, false);
			}
		}
		if (report_interface) {
			CM_DBG("Found Haggle Bluetooth device [%s:%s]\n", 
				addr.getStr(), name.c_str());

			BluetoothInterface foundInterface(macaddr, name, &addr, IFFLAG_UP);

			conn->report_interface(&foundInterface, 
                                               conn->rootInterface, new ConnectivityInterfacePolicyTTL(2));
			count++;
		} else {
			CM_DBG("Bluetooth device [%s] is not a Haggle device\n", 
				addr.getStr());
		}
	}

	// cleanup
	WSALookupServiceEnd(hScan);

	return;
}