Merge "Added flush() for bluetooth output stream" into jb-mr2-dev
This commit is contained in:
@@ -84,4 +84,15 @@ import java.io.OutputStream;
|
|||||||
}
|
}
|
||||||
mSocket.write(b, offset, count);
|
mSocket.write(b, offset, count);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Wait until the data in sending queue is emptied. A polling version
|
||||||
|
* for flush implementation. Use it to ensure the writing data afterwards will
|
||||||
|
* be packed in the new RFCOMM frame.
|
||||||
|
* @throws IOException
|
||||||
|
* if an i/o error occurs.
|
||||||
|
* @since Android 4.2.3
|
||||||
|
*/
|
||||||
|
public void flush() throws IOException {
|
||||||
|
mSocket.flush();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -192,6 +192,7 @@ public final class BluetoothSocket implements Closeable {
|
|||||||
if (VDBG) Log.d(TAG, "socket fd passed by stack fds: " + fds);
|
if (VDBG) Log.d(TAG, "socket fd passed by stack fds: " + fds);
|
||||||
if(fds == null || fds.length != 1) {
|
if(fds == null || fds.length != 1) {
|
||||||
Log.e(TAG, "socket fd passed from stack failed, fds: " + fds);
|
Log.e(TAG, "socket fd passed from stack failed, fds: " + fds);
|
||||||
|
as.close();
|
||||||
throw new IOException("bt socket acept failed");
|
throw new IOException("bt socket acept failed");
|
||||||
}
|
}
|
||||||
as.mSocket = new LocalSocket(fds[0]);
|
as.mSocket = new LocalSocket(fds[0]);
|
||||||
@@ -407,6 +408,17 @@ public final class BluetoothSocket implements Closeable {
|
|||||||
if (VDBG) Log.d(TAG, "available: " + mSocketIS);
|
if (VDBG) Log.d(TAG, "available: " + mSocketIS);
|
||||||
return mSocketIS.available();
|
return mSocketIS.available();
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Wait until the data in sending queue is emptied. A polling version
|
||||||
|
* for flush implementation. Used to ensure the writing data afterwards will
|
||||||
|
* be packed in new RFCOMM frame.
|
||||||
|
* @throws IOException
|
||||||
|
* if an i/o error occurs.
|
||||||
|
*/
|
||||||
|
/*package*/ void flush() throws IOException {
|
||||||
|
if (VDBG) Log.d(TAG, "flush: " + mSocketOS);
|
||||||
|
mSocketOS.flush();
|
||||||
|
}
|
||||||
|
|
||||||
/*package*/ int read(byte[] b, int offset, int length) throws IOException {
|
/*package*/ int read(byte[] b, int offset, int length) throws IOException {
|
||||||
|
|
||||||
|
|||||||
@@ -136,8 +136,28 @@ class LocalSocketImpl
|
|||||||
write_native(b, myFd);
|
write_native(b, myFd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wait until the data in sending queue is emptied. A polling version
|
||||||
|
* for flush implementation.
|
||||||
|
* @throws IOException
|
||||||
|
* if an i/o error occurs.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void flush() throws IOException {
|
||||||
|
FileDescriptor myFd = fd;
|
||||||
|
if (myFd == null) throw new IOException("socket closed");
|
||||||
|
while(pending_native(fd) > 0) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(10);
|
||||||
|
} catch (InterruptedException ie) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private native int pending_native(FileDescriptor fd) throws IOException;
|
||||||
private native int available_native(FileDescriptor fd) throws IOException;
|
private native int available_native(FileDescriptor fd) throws IOException;
|
||||||
private native void close_native(FileDescriptor fd) throws IOException;
|
private native void close_native(FileDescriptor fd) throws IOException;
|
||||||
private native int read_native(FileDescriptor fd) throws IOException;
|
private native int read_native(FileDescriptor fd) throws IOException;
|
||||||
|
|||||||
@@ -371,7 +371,31 @@ static void socket_setOption(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
static jint socket_pending (JNIEnv *env, jobject object,
|
||||||
|
jobject fileDescriptor)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
|
||||||
|
|
||||||
|
if (env->ExceptionOccurred() != NULL) {
|
||||||
|
return (jint)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pending;
|
||||||
|
int ret = ioctl(fd, TIOCOUTQ, &pending);
|
||||||
|
|
||||||
|
// If this were a non-socket fd, there would be other cases to worry
|
||||||
|
// about...
|
||||||
|
|
||||||
|
//ALOGD("socket_pending, ioctl ret:%d, pending:%d", ret, pending);
|
||||||
|
if (ret < 0) {
|
||||||
|
jniThrowIOException(env, errno);
|
||||||
|
return (jint) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (jint)pending;
|
||||||
|
}
|
||||||
static jint socket_available (JNIEnv *env, jobject object,
|
static jint socket_available (JNIEnv *env, jobject object,
|
||||||
jobject fileDescriptor)
|
jobject fileDescriptor)
|
||||||
{
|
{
|
||||||
@@ -893,6 +917,7 @@ static JNINativeMethod gMethods[] = {
|
|||||||
{"accept", "(Ljava/io/FileDescriptor;Landroid/net/LocalSocketImpl;)Ljava/io/FileDescriptor;", (void*)socket_accept},
|
{"accept", "(Ljava/io/FileDescriptor;Landroid/net/LocalSocketImpl;)Ljava/io/FileDescriptor;", (void*)socket_accept},
|
||||||
{"shutdown", "(Ljava/io/FileDescriptor;Z)V", (void*)socket_shutdown},
|
{"shutdown", "(Ljava/io/FileDescriptor;Z)V", (void*)socket_shutdown},
|
||||||
{"available_native", "(Ljava/io/FileDescriptor;)I", (void*) socket_available},
|
{"available_native", "(Ljava/io/FileDescriptor;)I", (void*) socket_available},
|
||||||
|
{"pending_native", "(Ljava/io/FileDescriptor;)I", (void*) socket_pending},
|
||||||
{"close_native", "(Ljava/io/FileDescriptor;)V", (void*) socket_close},
|
{"close_native", "(Ljava/io/FileDescriptor;)V", (void*) socket_close},
|
||||||
{"read_native", "(Ljava/io/FileDescriptor;)I", (void*) socket_read},
|
{"read_native", "(Ljava/io/FileDescriptor;)I", (void*) socket_read},
|
||||||
{"readba_native", "([BIILjava/io/FileDescriptor;)I", (void*) socket_readba},
|
{"readba_native", "([BIILjava/io/FileDescriptor;)I", (void*) socket_readba},
|
||||||
|
|||||||
Reference in New Issue
Block a user