diff --git a/src/main/java/com/samskivert/net/cddb/CDDB.java b/src/main/java/com/samskivert/net/cddb/CDDB.java index a2c9f55d..243d8b54 100644 --- a/src/main/java/com/samskivert/net/cddb/CDDB.java +++ b/src/main/java/com/samskivert/net/cddb/CDDB.java @@ -71,7 +71,7 @@ public class CDDB /** * Connects this CDDB instance to the CDDB server running on the supplied host using the - * standard port. + * standard port, name and version. * *
Note well: you must close a CDDB connection once you are done with it, otherwise * the socket connection will remain open and pointlessly consume machine resources. @@ -94,7 +94,7 @@ public class CDDB /** * Connects this CDDB instance to the CDDB server running on the supplied host using the - * specified port. + * specified port and default client name and version. * *
Note well: you must close a CDDB connection once you are done with it, otherwise * the socket connection will remain open and pointlessly consume machine resources. @@ -111,6 +111,31 @@ public class CDDB */ public String connect (String hostname, int port) throws IOException, CDDBException + { + return connect(hostname, port, CLIENT_NAME, CLIENT_VERSION); + } + + /** + * Connects this CDDB instance to the CDDB server running on the supplied host using the + * specified port. + * + *
Note well: you must close a CDDB connection once you are done with it, otherwise
+ * the socket connection will remain open and pointlessly consume machine resources.
+ *
+ * @param hostname The host to which to connect.
+ * @param port The port number on which to connect to the host.
+ * @param clientName The name of the application establishing this connection.
+ * @param clientVersion The version of the application establishing this connection.
+ *
+ * @exception IOException Thrown if a network error occurs attempting to connect to the host.
+ * @exception CDDBException Thrown if an error occurs after identifying ourselves to the host.
+ *
+ * @return The message supplied with the succesful connection response.
+ *
+ * @see #close
+ */
+ public String connect (String hostname, int port, String clientName, String clientVersion)
+ throws IOException, CDDBException
{
// obtain the necessary information we'll need to identify
// ourselves to the CDDB server
@@ -123,20 +148,28 @@ public class CDDB
// establish our socket connection and IO streams
InetAddress addr = InetAddress.getByName(hostname);
_sock = new Socket(addr, port);
- _in = new BufferedReader(new InputStreamReader(_sock.getInputStream()));
- _out = new PrintStream(new BufferedOutputStream(_sock.getOutputStream()));
+ _in = new BufferedReader(new InputStreamReader(_sock.getInputStream(), "ISO-8859-1"));
+ _out = new PrintStream(new BufferedOutputStream(_sock.getOutputStream()), false, "ISO-8859-1");
// first read (and discard) the banner string
_in.readLine();
+ // try and change to the latest protocol version
+ Response rsp = request("proto 6");
+ if (rsp.code == 201 || rsp.code == 501) {
+ // Protocol 6 uses UTF-8
+ _in = new BufferedReader(new InputStreamReader(_sock.getInputStream(), "UTF-8"));
+ _out = new PrintStream(new BufferedOutputStream(_sock.getOutputStream()), false, "UTF-8");
+ }
+
// send a hello request
StringBuilder req = new StringBuilder("cddb hello ");
req.append(username).append(" ");
req.append(localhost).append(" ");
- req.append(CLIENT_NAME).append(" ");
- req.append(CLIENT_VERSION);
+ req.append(clientName).append(" ");
+ req.append(clientVersion);
- Response rsp = request(req.toString());
+ rsp = request(req.toString());
// confirm that the response was a successful one
if (CDDBProtocol.codeFamily(rsp.code) != CDDBProtocol.OK &&
@@ -185,6 +218,42 @@ public class CDDB
}
}
+ /**
+ * Fetches the list of categories supported by the server.
+ *
+ * @return the categories
+ * @throws IOException
+ * if a problem occurs chatting to the server
+ * @throws CDDBException
+ * if the server responds with an error
+ */
+ public String[] lscat()
+ throws IOException, CDDBException
+ {
+ // sanity check
+ if (_sock == null) {
+ throw new CDDBException(500, "Not connected");
+ }
+
+ // make the request
+ Response rsp = request("cddb lscat");
+
+ // anything other than an OK response earns an exception
+ if (rsp.code != 210) {
+ throw new CDDBException(rsp.code, rsp.message);
+ }
+
+ ArrayList