/* * Copyright 1990-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */ package com.sun.jsr082.bluetooth; import java.io.IOException; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; import javax.bluetooth.UUID; /* * JavaSDPClient class provides a client side of SDP connection as described in * Bluetooth Specification version 1.2. */ public class JavaSDPClient implements SDPClient{ /* Transport connection for this client. */ private SDPClientConnection connection = null; /* Bluetooth address this client is connected to. */ private String address = null; private Hashtable ssTrnas = new Hashtable(); private static final boolean DEBUG = false; /* * Constructs an <code>JavaSDPClient<code> object and opens SDP connection * to the remote device with the specified Bluetooth address. * * @param bluetoothAddress bluetooth address of SDP server */ public JavaSDPClient(String bluetoothAddress) throws IOException { address = bluetoothAddress; try { connection = SDPClientConnection.getSDPClientConnection(address); } catch (IOException e) { //TODO add proper handling routines e.printStackTrace(); } } /* * Closes connection of this client to the specified server. * * @throws IOException if no connection is open */ public void close() throws IOException { if (DEBUG) { System.out.println("* JavaSDPClient: finishing transactions"); } Enumeration trs = (Enumeration) ssTrnas.keys(); synchronized (ssTrnas) { while (trs.hasMoreElements()) { Object key = trs.nextElement(); SDPClientTransaction tr = (SDPClientTransaction) ssTrnas .get(key); if (tr != null) { tr.finish(); } } ssTrnas.clear(); } if (DEBUG) { System.out.println("* JavaSDPClient: closing connection"); } if (connection != null) { connection.release(); connection = null; } if (DEBUG) { System.out.println("* JavaSDPClient: Canceling all receivers"); } SDPClientReceiver.cancel(); if (DEBUG) { System.out.println("* JavaSDPClient: closed"); } } public void removeTransaction( String transID ) { synchronized (ssTrnas) { ssTrnas.remove( transID ); } } public SDPClientConnection getConnection() { return connection; } /* * Initiates ServiceSearch transaction that is used to search for * services that have all the UUIDs specified on a server. */ public void serviceSearchRequest(UUID[] uuidSet, int transactionID, SDPResponseListener listener) throws IOException { SDPClientTransaction tr = null; tr = new ClientServiceSearchTransaction(this, transactionID, listener, uuidSet); synchronized (ssTrnas) { ssTrnas.put(tr.getID(), tr); } tr.start(); } /* * Initiates ServiceAttribute transaction that retrieves * specified attribute values from a specific service record. */ public void serviceAttributeRequest(int serviceRecordHandle, int[] attrSet, int transactionID, SDPResponseListener listener) throws IOException { SDPClientTransaction tr = new ClientServiceAttributeTransaction(this, transactionID, listener, serviceRecordHandle, attrSet); synchronized (ssTrnas) { ssTrnas.put(tr.getID(), tr); } tr.start(); } /* * Initiates ServiceSearchAttribute transaction that searches for services * on a server by UUIDs specified and retrieves values of specified * parameters for service records found. */ public void serviceSearchAttributeRequest(int[] attrSet, UUID[] uuidSet, int transactionID, SDPResponseListener listener) throws IOException { SDPClientTransaction tr = new ClientServiceSearchAttributeTransaction( this, transactionID, listener, attrSet, uuidSet ); synchronized (ssTrnas) { ssTrnas.put(tr.getID(), tr); } tr.start(); } /* * Cancels transaction with given ID. */ public boolean cancelServiceSearch(int transactionID) { SDPClientTransaction tr = null; boolean isCanceled = false; synchronized (ssTrnas) { String id = "" + transactionID + "_" + SDPClientTransaction.SDP_SERVICE_SEARCH_REQUEST; tr = (SDPClientTransaction)ssTrnas.get( id ); ssTrnas.remove(id); } if (tr != null) { tr.cancel(SDPResponseListener.TERMINATED); isCanceled = true; } return isCanceled; } }