Пример #1
0
/**
 * Retrieves SDP record identified by "handle". Session must be already opened.
 */
sdp_record_t *get_sdp_record(sdp_session_t *session, int handle) {
	sdp_list_t *attrid;
	uint32_t range = 0x0000ffff;
	sdp_record_t *rec;

	attrid = sdp_list_append(0, &range);
	rec = sdp_service_attr_req(session, handle, SDP_ATTR_REQ_RANGE, attrid);
	sdp_list_free(attrid,0);

	return rec;
}
JNIEXPORT jboolean JNICALL Java_com_intel_bluetooth_BluetoothStackBlueZ_populateServiceRecordAttributeValuesImpl
  (JNIEnv *env, jobject peer, jlong localDeviceBTAddress, jlong remoteDeviceAddressLong, jlong sdpSession, jlong handle, jintArray attrIDs, jobject serviceRecord) {
    sdp_session_t* session = (sdp_session_t*)jlong2ptr(sdpSession);
    sdp_session_t* close_session_on_return = NULL;
    if (session != NULL) {
        debug("populateServiceRecordAttributeValuesImpl connected %p, recordHandle %li", session, handle);
    } else {
        debug("populateServiceRecordAttributeValuesImpl connects, recordHandle %li", handle);
        bdaddr_t localAddr;
        longToDeviceAddr(localDeviceBTAddress, &localAddr);
        bdaddr_t remoteAddress;
        longToDeviceAddr(remoteDeviceAddressLong, &remoteAddress);
        session = sdp_connect(&localAddr, &remoteAddress, SDP_RETRY_IF_BUSY);
        if (session == NULL) {
            debug("populateServiceRecordAttributeValuesImpl can't connect");
            return JNI_FALSE;
        }
        // Close session on exit
       close_session_on_return = session;
    }

    sdp_list_t *attr_list = NULL;
    jboolean isCopy = JNI_FALSE;
    jint* ids = (*env)->GetIntArrayElements(env, attrIDs, &isCopy);
    int i;
    for(i = 0; i < (*env)->GetArrayLength(env, attrIDs); i++) {
        uint16_t* id = (uint16_t*)malloc(sizeof(uint16_t));
        *id=(uint16_t)ids[i];
        attr_list = sdp_list_append(attr_list,id);
    }

    jboolean rc = JNI_FALSE;
    sdp_record_t *sdpRecord = sdp_service_attr_req(session, (uint32_t)handle, SDP_ATTR_REQ_INDIVIDUAL, attr_list);
    if (!sdpRecord) {
        debug("sdp_service_attr_req return error");
        rc = JNI_FALSE;
    } else {
        populateServiceRecord(env, serviceRecord, sdpRecord, attr_list);
        sdp_record_free(sdpRecord);
        rc = JNI_TRUE;
    }
    sdp_list_free(attr_list, free);
    if (close_session_on_return != NULL) {
        sdp_close(close_session_on_return);
    }

    return rc;
}
Пример #3
0
/*
 * 	sdpunregister - Remove SDP entry for HID service on program termination
 * 	Parameters: SDP handle (typically 0x10004 or similar)
 */
void	sdpunregister ( uint32_t handle )
{
        uint32_t	range=0x0000ffff;
	sdp_list_t    *	attr;
	sdp_session_t *	sess;
	sdp_record_t  *	rec;
	// Connect to the local SDP server
	sess = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, 0);
	if ( !sess )	return;
	attr = sdp_list_append(0, &range);
	rec = sdp_service_attr_req(sess, handle, SDP_ATTR_REQ_RANGE, attr);
	sdp_list_free(attr, 0);
	if ( !rec ) {
		sdp_close(sess);
		return;
	}
	sdp_device_record_unregister(sess, BDADDR_ANY, rec);
	sdp_close(sess);
	// We do not care wether unregister fails. If it does, we cannot help it.
	return;
}
Пример #4
0
int unregister_record(){

		uint32_t	  range = 0x0000ffff;
		sdp_list_t    *attribute;
		sdp_session_t *session;
		sdp_record_t  *record;

		// Connect to the local SDP server
		session = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, SDP_RETRY_IF_BUSY);

		if ( !session ){

			//	LOGCAT:
			__android_log_print(ANDROID_LOG_DEBUG, TAG, "SDP: Connection to SDP failed.");
			return CODE_SDP_SESSION_FAILED;

		}

		attribute = sdp_list_append(0, &range);

		//	Search withing a range of 0x00 - 0x0000ffff for service record attribute
		//  that has the same value as the ServiceRecordHandle attribute,
		// 	we specified for our service. Once the ServiceRecordHandle is found
		//	give back the record that contains it.
		//  This should be the record we previously added.
		record = sdp_service_attr_req(session, handle, SDP_ATTR_REQ_RANGE, attribute);

		sdp_list_free(attribute, 0);


		if ( !record ) {

			// No such record is found

			//	LOGCAT:
			__android_log_print(ANDROID_LOG_DEBUG, TAG, "SDP: Record request has failed.");

			sdp_close(session);
			return CODE_RECORD_REQUEST_FAILED;
		}


		// The rcord is found, so remove it from the registry
		if (sdp_device_record_unregister(session, BDADDR_ANY, record)) {

			//	LOGCAT:
			__android_log_print(ANDROID_LOG_DEBUG, TAG, "SDP: Record unregistration has failed.");

			sdp_close(session);
			return CODE_RECORD_UNREGISTER_FAILED;

		}

		//	LOGCAT:
		__android_log_print(ANDROID_LOG_DEBUG, TAG, "SDP: Unregistration successful.");

		sdp_close(session);

		return CODE_RECORD_UNREGISTERED;
	
}