prevent IO on main thread
When starting up discovery, prior code fetches IP address for manually-
added printers. For named printers this results in IO on main thread,
causing an exception. This change captures IP address during capability scan.
Test: Manually add a DNS-resolvable printer and restart printing
Change-Id: I0f87de92a847ce41381a94aa5d5a7bbf8ecb4165
Signed-off-by: Glade Diviney <mopriadevteam@gmail.com>
diff --git a/src/com/android/bips/LocalDiscoverySession.java b/src/com/android/bips/LocalDiscoverySession.java
index fa41ad0..cd982a4 100644
--- a/src/com/android/bips/LocalDiscoverySession.java
+++ b/src/com/android/bips/LocalDiscoverySession.java
@@ -296,13 +296,10 @@
* @return {@code true} iff the printer should be suppressed
*/
private boolean isHandledByOtherService(LocalPrinter printer) {
- ArrayList<String> printerServices;
- try {
- printerServices = mPrintersOfOtherService.get(printer.getAddress());
- } catch (UnknownHostException e) {
- Log.e(TAG, "Cannot resolve address for " + printer, e);
- return false;
- }
+ InetAddress address = printer.getAddress();
+ if (address == null) return false;
+
+ ArrayList<String> printerServices = mPrintersOfOtherService.get(printer.getAddress());
if (printerServices != null) {
int numServices = printerServices.size();
diff --git a/src/com/android/bips/LocalPrinter.java b/src/com/android/bips/LocalPrinter.java
index efd622b..96a75e7 100644
--- a/src/com/android/bips/LocalPrinter.java
+++ b/src/com/android/bips/LocalPrinter.java
@@ -55,13 +55,12 @@
mPrinterId = discoveredPrinter.getId(printService);
}
- /**
- * @return The address of the printer or {@code null} if the printer is not reachable
- *
- * @throws UnknownHostException if the address could not be resolved
- */
- public InetAddress getAddress() throws UnknownHostException {
- return InetAddress.getByName(mDiscoveredPrinter.path.getHost());
+ /** Return the address of the printer or {@code null} if not known */
+ public InetAddress getAddress() {
+ if (mCapabilities != null) {
+ return mCapabilities.inetAddress;
+ }
+ return null;
}
/** Return true if this printer should be aged out */
diff --git a/src/com/android/bips/ipp/GetCapabilitiesTask.java b/src/com/android/bips/ipp/GetCapabilitiesTask.java
index 5554ba6..f37442e 100644
--- a/src/com/android/bips/ipp/GetCapabilitiesTask.java
+++ b/src/com/android/bips/ipp/GetCapabilitiesTask.java
@@ -25,8 +25,10 @@
import com.android.bips.jni.LocalPrinterCapabilities;
import java.io.IOException;
+import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
+import java.net.UnknownHostException;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
@@ -63,6 +65,12 @@
long start = System.currentTimeMillis();
LocalPrinterCapabilities printerCaps = new LocalPrinterCapabilities();
+ try {
+ printerCaps.inetAddress = InetAddress.getByName(mUri.getHost());
+ } catch (UnknownHostException e) {
+ return null;
+ }
+
boolean online = isDeviceOnline(mUri);
if (DEBUG) {
Log.d(TAG, "isDeviceOnline uri=" + mUri + " online=" + online +
diff --git a/src/com/android/bips/jni/LocalPrinterCapabilities.java b/src/com/android/bips/jni/LocalPrinterCapabilities.java
index d5bca7a..4b9671e 100644
--- a/src/com/android/bips/jni/LocalPrinterCapabilities.java
+++ b/src/com/android/bips/jni/LocalPrinterCapabilities.java
@@ -25,6 +25,7 @@
import com.android.bips.BuiltInPrintService;
import com.android.bips.R;
+import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
@@ -48,6 +49,8 @@
public int[] supportedMediaTypes;
public int[] supportedMediaSizes;
+ public InetAddress inetAddress;
+
/** Bears the underlying native C structure (printer_capabilities_t) or null if not present */
public byte[] nativeData;
@@ -118,6 +121,7 @@
" mediaDefault=" + mediaDefault +
" supportedMediaTypes=" + Arrays.toString(supportedMediaTypes) +
" supportedMediaSizes=" + Arrays.toString(supportedMediaSizes) +
+ " inetAddress=" + inetAddress +
"}";
}
}
\ No newline at end of file