summaryrefslogtreecommitdiffstats
path: root/core/jni
diff options
context:
space:
mode:
authorJaikumar Ganesh <jaikumar@google.com>2009-09-29 13:00:30 -0700
committerJaikumar Ganesh <jaikumar@google.com>2009-09-30 17:46:17 -0700
commit54172d92afec5d7d18c830d7428a3230a39d4c02 (patch)
tree101993c906e08d4dcfe550093a8f9d68aeda7dab /core/jni
parent4c9a29efdbf58034c1d90eb001dc7299f1f012ea (diff)
downloadframeworks_base-54172d92afec5d7d18c830d7428a3230a39d4c02.zip
frameworks_base-54172d92afec5d7d18c830d7428a3230a39d4c02.tar.gz
frameworks_base-54172d92afec5d7d18c830d7428a3230a39d4c02.tar.bz2
Try to reconnect twice when the rfcomm error code is Connection Refused.
This happens when the the remote headset is in a bad state or is not accepting connections. Try twice before giving up. Change-Id: I55e15bad6b72904b8e4ccbca89e17e9bd3ddb61e
Diffstat (limited to 'core/jni')
-rw-r--r--core/jni/android_bluetooth_HeadsetBase.cpp24
1 files changed, 13 insertions, 11 deletions
diff --git a/core/jni/android_bluetooth_HeadsetBase.cpp b/core/jni/android_bluetooth_HeadsetBase.cpp
index bb19e92..bad0186 100644
--- a/core/jni/android_bluetooth_HeadsetBase.cpp
+++ b/core/jni/android_bluetooth_HeadsetBase.cpp
@@ -260,7 +260,7 @@ static jboolean connectNative(JNIEnv *env, jobject obj)
#endif
}
-static jboolean connectAsyncNative(JNIEnv *env, jobject obj) {
+static jint connectAsyncNative(JNIEnv *env, jobject obj) {
LOGV(__FUNCTION__);
#ifdef HAVE_BLUETOOTH
struct sockaddr_rc addr;
@@ -268,7 +268,7 @@ static jboolean connectAsyncNative(JNIEnv *env, jobject obj) {
if (nat->rfcomm_connected) {
LOGV("RFCOMM socket is already connected or connection is in progress.");
- return JNI_TRUE;
+ return 0;
}
if (nat->rfcomm_sock < 0) {
@@ -278,7 +278,7 @@ static jboolean connectAsyncNative(JNIEnv *env, jobject obj) {
if (nat->rfcomm_sock < 0) {
LOGE("%s: Could not create RFCOMM socket: %s\n", __FUNCTION__,
strerror(errno));
- return JNI_FALSE;
+ return -1;
}
if (debug_no_encrypt()) {
@@ -291,7 +291,7 @@ static jboolean connectAsyncNative(JNIEnv *env, jobject obj) {
sizeof(lm)) < 0) {
LOGE("%s: Can't set RFCOMM link mode", __FUNCTION__);
close(nat->rfcomm_sock);
- return JNI_FALSE;
+ return -1;
}
LOGI("Created RFCOMM socket fd %d.", nat->rfcomm_sock);
}
@@ -314,7 +314,7 @@ static jboolean connectAsyncNative(JNIEnv *env, jobject obj) {
if (rc >= 0) {
nat->rfcomm_connected = 1;
LOGI("async connect successful");
- return JNI_TRUE;
+ return 0;
}
else if (rc < 0) {
if (errno == EINPROGRESS || errno == EAGAIN)
@@ -322,20 +322,20 @@ static jboolean connectAsyncNative(JNIEnv *env, jobject obj) {
LOGI("async connect is in progress (%s)",
strerror(errno));
nat->rfcomm_connected = -1;
- return JNI_TRUE;
+ return 0;
}
else
{
LOGE("async connect error: %s (%d)", strerror(errno), errno);
close(nat->rfcomm_sock);
nat->rfcomm_sock = -1;
- return JNI_FALSE;
+ return -errno;
}
}
} // fcntl(nat->rfcomm_sock ...)
} // if (nat->rfcomm_sock_flags >= 0)
#endif
- return JNI_FALSE;
+ return -1;
}
static jint waitForAsyncConnectNative(JNIEnv *env, jobject obj,
@@ -357,9 +357,11 @@ static jint waitForAsyncConnectNative(JNIEnv *env, jobject obj,
close(nat->rfcomm_sock);
nat->rfcomm_sock = -1;
}
- if (JNI_FALSE == connectAsyncNative(env, obj)) {
+ int ret = connectAsyncNative(env, obj);
+
+ if (ret < 0) {
LOGI("Failed to re-open RFCOMM socket!");
- return -1;
+ return ret;
}
if (nat->rfcomm_sock >= 0) {
@@ -532,7 +534,7 @@ static JNINativeMethod sMethods[] = {
{"initializeNativeDataNative", "(I)V", (void *)initializeNativeDataNative},
{"cleanupNativeDataNative", "()V", (void *)cleanupNativeDataNative},
{"connectNative", "()Z", (void *)connectNative},
- {"connectAsyncNative", "()Z", (void *)connectAsyncNative},
+ {"connectAsyncNative", "()I", (void *)connectAsyncNative},
{"waitForAsyncConnectNative", "(I)I", (void *)waitForAsyncConnectNative},
{"disconnectNative", "()V", (void *)disconnectNative},
{"sendURCNative", "(Ljava/lang/String;)Z", (void *)sendURCNative},