diff options
| author | Jaikumar Ganesh <jaikumar@google.com> | 2009-09-29 13:00:30 -0700 |
|---|---|---|
| committer | Jaikumar Ganesh <jaikumar@google.com> | 2009-09-30 17:46:17 -0700 |
| commit | 54172d92afec5d7d18c830d7428a3230a39d4c02 (patch) | |
| tree | 101993c906e08d4dcfe550093a8f9d68aeda7dab /core/jni | |
| parent | 4c9a29efdbf58034c1d90eb001dc7299f1f012ea (diff) | |
| download | frameworks_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.cpp | 24 |
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}, |
