📄 btimageclient.java
字号:
isDownloadCanceled = false; // ok, wait for download or need to wait for next search try { wait(); } catch (InterruptedException e) { System.err.println("Unexpected interuption: " + e); return; } // check the component is destroyed if (isClosed) { return; } // this means "go to begining" if (imageNameToLoad == null) { break; } // load selected image data Image img = loadImage(); // FIXME: this never happen - monitor is taken... if (isClosed) { return; } if (isDownloadCanceled) { continue; // may be next image to be download } if (img == null) { parent.informLoadError("Can't load image: " + imageNameToLoad); continue; // may be next image to be download } // ok, show image to user parent.showImage(img); // may be next image to be download continue; } } } /** * Search for bluetooth devices. * * @return false if should end the component work. */ private boolean searchDevices() { // ok, start a new search then state = DEVICE_SEARCH; devices.removeAllElements(); try { discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this); } catch (BluetoothStateException e) { System.err.println("Can't start inquiry now: " + e); parent.informSearchError("Can't start device search"); return true; } try { wait(); // until devices are found } catch (InterruptedException e) { System.err.println("Unexpected interuption: " + e); return false; } // this "wake up" may be caused by 'destroy' call if (isClosed) { return false; } // no?, ok, let's check the return code then switch (discType) { case INQUIRY_ERROR: parent.informSearchError("Device discovering error..."); // fall through case INQUIRY_TERMINATED: // make sure no garbage in found devices list devices.removeAllElements(); // nothing to report - go to next request break; case INQUIRY_COMPLETED: if (devices.size() == 0) { parent.informSearchError("No devices in range"); } // go to service search now break; default: // what kind of system you are?... :( System.err.println("system error:" + " unexpected device discovery code: " + discType); destroy(); return false; } return true; } /** * Search for proper service. * * @return false if should end the component work. */ private boolean searchServices() { state = SERVICE_SEARCH; records.removeAllElements(); searchIDs = new int[devices.size()]; boolean isSearchStarted = false; for (int i = 0; i < devices.size(); i++) { RemoteDevice rd = (RemoteDevice) devices.elementAt(i); try { searchIDs[i] = discoveryAgent.searchServices(attrSet, uuidSet, rd, this); } catch (BluetoothStateException e) { System.err.println("Can't search services for: " + rd.getBluetoothAddress() + " due to " + e); } isSearchStarted = true; } // at least one of the services search should be found if (!isSearchStarted) { return true; } try { wait(); // until services are found } catch (InterruptedException e) { System.err.println("Unexpected interuption: " + e); return false; } // this "wake up" may be caused by 'destroy' call if (isClosed) { return false; } // actually, no services were found if (records.size() == 0) { parent.informSearchError("No proper services were found"); } return true; } /** * Gets the collection of the images titles (names) * from the services, prepares a hashtable to match * the image name to a services list, presents the images names * to user finally. * * @return false if no names in found services. */ private boolean presentUserSearchResults() { base.clear(); for (int i = 0; i < records.size(); i++) { ServiceRecord sr = (ServiceRecord) records.elementAt(i); // get the attribute with images names DataElement de = sr.getAttributeValue(IMAGES_NAMES_ATTRIBUTE_ID); if (de == null) { System.err.println("Unexpected service - missed attribute"); continue; } // get the images names from this attribute Enumeration en = (Enumeration) de.getValue(); while (en.hasMoreElements()) { de = (DataElement) en.nextElement(); String name = (String) de.getValue(); // name may be stored already Object obj = base.get(name); // that's either the ServiceRecord or Vector if (obj != null) { Vector v; if (obj instanceof ServiceRecord) { v = new Vector(); v.addElement(obj); } else { v = (Vector) obj; } v.addElement(sr); obj = v; } else { obj = sr; } base.put(name, obj); } } return parent.showImagesNames(base); } /** * Loads selected image data. */ private Image loadImage() { if (imageNameToLoad == null) { System.err.println("Error: imageNameToLoad=null"); return null; } // ok, get the list of service records ServiceRecord[] sr = null; Object obj = base.get(imageNameToLoad); if (obj == null) { System.err.println("Error: no record for: " + imageNameToLoad); return null; } else if (obj instanceof ServiceRecord) { sr = new ServiceRecord[] { (ServiceRecord) obj }; } else { Vector v = (Vector) obj; sr = new ServiceRecord[v.size()]; for (int i = 0; i < v.size(); i++) { sr[i] = (ServiceRecord) v.elementAt(i); } } // now try to load the image from each services one by one for (int i = 0; i < sr.length; i++) { StreamConnection conn = null; String url = null; // the process may be canceled if (isDownloadCanceled) { return null; } // first - connect try { url = sr[i].getConnectionURL( ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false); conn = (StreamConnection) Connector.open(url); } catch (IOException e) { System.err.println("Note: can't connect to: " + url); // ignore continue; } // then open a steam and write a name try { OutputStream out = conn.openOutputStream(); out.write(imageNameToLoad.length()); // length is 1 byte out.write(imageNameToLoad.getBytes()); out.close(); } catch (IOException e) { System.err.println("Can't write to server for: " + url); // close stream connection try { conn.close(); } catch (IOException ee) {} // ignore continue; } // then open a steam and read an image byte[] imgData = null; try { InputStream in = conn.openInputStream(); // read a length first int length = in.read() << 8; length |= in.read(); if (length <= 0) { throw new IOException("Can't read a length"); } // read the image now imgData = new byte[length]; length = 0; while (length != imgData.length) { int n = in.read(imgData, length, imgData.length - length); if (n == -1) { throw new IOException("Can't read a image data"); } length += n; } in.close(); } catch (IOException e) { System.err.println("Can't read from server for: " + url); continue; } finally { // close stream connection anyway try { conn.close(); } catch (IOException e) {} // ignore } // ok, may it's a chance Image img = null; try { img = Image.createImage(imgData, 0, imgData.length); } catch (Exception e) { // may be next time System.err.println("Error: wrong image data from: " + url); continue; } return img; } return null; }} // end of class 'BTImageClient' definition
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -