summaryrefslogtreecommitdiffstats
path: root/source/client/request/Request.java
diff options
context:
space:
mode:
Diffstat (limited to 'source/client/request/Request.java')
-rw-r--r--source/client/request/Request.java225
1 files changed, 225 insertions, 0 deletions
diff --git a/source/client/request/Request.java b/source/client/request/Request.java
new file mode 100644
index 0000000..2c54972
--- /dev/null
+++ b/source/client/request/Request.java
@@ -0,0 +1,225 @@
+/*
+ * Created on May 6, 2003
+ *
+ * To change the template for this generated file go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+Copyright 2003 Joseph Barnett
+
+This File is part of "one 2 oh my god"
+
+"one 2 oh my god" is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+Free Software Foundation; either version 2 of the License, or
+your option) any later version.
+
+"one 2 oh my god" 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with "one 2 oh my god"; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ */
+package itunes.client.request;
+
+import itunes.*;
+import itunes.util.Hasher;
+
+import java.net.*;
+import java.io.*;
+import java.util.ArrayList;
+/**
+ * @author jbarnett
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public abstract class Request {
+ public static final int ITUNES_PORT = 3689;
+ public static boolean debug = false;
+ protected String server;
+ protected int port;
+ public byte[] data;
+ protected int offset;
+ protected int expectedLength;
+ protected String dataType;
+ protected ArrayList fieldPairs;
+ protected ArrayList mlitIndexes;
+ protected ArrayList mlclIndexes;
+ protected ArrayList mdclIndexes;
+ protected String requestString;
+
+
+ public Request(String server, int port, String rs) throws NoServerPermissionException {
+ this.server = server;
+ this.port = port;
+ dataType = "";
+ offset = 0;
+ fieldPairs = new ArrayList();
+ mlitIndexes = new ArrayList();
+ mlclIndexes = new ArrayList();
+ mdclIndexes = new ArrayList();
+ requestString = rs;
+ Query();
+ Process();
+ }
+
+ protected void Query() throws NoServerPermissionException {
+ URL url =null;
+ try {
+ url = new URL("http://"+server+":"+port+"/"+requestString);
+ if (debug)
+ System.out.println("Processing Request: "+ server+":"+port+"/"+requestString);
+ URLConnection urlc = url.openConnection();
+ String hashCode = Hasher.GenerateHash("/" + requestString,1);
+ urlc.addRequestProperty("Client-DAAP-Validation", hashCode);
+ urlc.addRequestProperty("Client-DAAP-Access-Index", "1");
+
+ DataInputStream in = new DataInputStream(urlc.getInputStream());
+ int len = urlc.getContentLength();
+ if (len == -1) {
+ return;
+ }
+ data = new byte[len];
+ in.readFully(data);
+ } catch (MalformedURLException e) {
+ if (debug)
+ System.out.println("Malformed URL");
+ } catch (IOException ioe) {
+ if (debug)
+ System.out.println(ioe.getLocalizedMessage());
+ throw new NoServerPermissionException();
+ }
+ }
+
+ protected static int readSize(String data) {
+ return readSize(data, 4);
+ }
+
+ protected static int readSize(String data, int j) {
+ String elength = "";
+ for (int i = 0; i < j; i++) {
+ elength += ((int)data.charAt(i)>15?"":"0") + Integer.toHexString((int)data.charAt(i));
+ }
+ return Integer.valueOf(elength,16).intValue();
+ }
+
+ protected String dataString(int i) {
+ return readString(data,offset,i);
+ }
+
+ public static String readString(byte[] data, int offset, int i) {
+ String a = "";
+ try {
+ a = new String(data, offset,i,"UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ return a;
+ }
+
+ protected int dataInt() {
+ return readInt(data, offset,4);
+ }
+
+ protected static int readInt(byte[] data, int offset) {
+ int i = 0;
+ try {
+ ByteArrayInputStream b = new ByteArrayInputStream(data, offset, 4);
+ DataInputStream d = new DataInputStream(b);
+ i = d.readInt();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return i;
+ }
+
+ public static int readInt(byte[] data, int offset, int size) {
+ int i = 0;
+ try {
+ ByteArrayInputStream b = new ByteArrayInputStream(data, offset, size);
+ DataInputStream d = new DataInputStream(b);
+ int pow = size*2 - 1;
+ for (int j = 0;j<size;j++) {
+ int num = (0xFF&d.readByte());
+ int up = ((int)Math.pow(16,pow))*(num/16);
+ pow--;
+ int down= ((int)Math.pow(16,pow))*(num%16);
+ i+= up + down;
+ pow--;
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return i;
+ }
+
+ protected void Process() throws NoServerPermissionException {
+ if (data==null || data.length==0) {
+ return;
+ }
+ dataType= dataString(4);
+ offset += 4;
+ int size = dataInt();
+ offset += 4;
+
+ fieldPairs = processDataFields();
+ }
+
+ protected ArrayList processDataFields(byte[] data, int offset) {
+ ArrayList fieldPairs = new ArrayList();
+ while (offset < data.length) {
+ String name="";
+ name = readString(data,offset,4);
+ offset +=4;
+ int size=readInt(data,offset);
+ offset+=4;
+ FieldPair fp = new FieldPair(name, data, offset, size);
+ offset += size;
+ fieldPairs.add(fp);
+ if (name.equals("mlcl")) {
+ mlclIndexes.add(new Integer(fieldPairs.size()-1));
+ } else if (name.equals("mlit")) {
+ mlitIndexes.add(new Integer(fieldPairs.size()-1));
+ } else if (name.equals("mdcl")) {
+ mdclIndexes.add(new Integer(fieldPairs.size()-1));
+ }
+ }
+ return fieldPairs;
+ }
+
+ protected ArrayList processDataFields() {
+ return processDataFields(data,offset);
+// ArrayList fieldPairs = new ArrayList();
+// while (offset < data.length) {
+// String name="";
+// name = dataString(4);
+// offset +=4;
+// int size=dataInt();
+// offset+=4;
+// FieldPair fp = new FieldPair(name, data, offset, size);
+// offset += size;
+// fieldPairs.add(fp);
+// if (name.equals("mlcl")) {
+// mlclIndexes.add(new Integer(fieldPairs.size()-1));
+// } else if (name.equals("mlit")) {
+// mlitIndexes.add(new Integer(fieldPairs.size()-1));
+// } else if (name.equals("mdcl")) {
+// mdclIndexes.add(new Integer(fieldPairs.size()-1));
+// }
+// }
+// return fieldPairs;
+ }
+
+ public String toString() {
+ String ret = "";
+ for (int i = 0; i < fieldPairs.size();i++) {
+ FieldPair fp = (FieldPair)fieldPairs.get(i);
+ ret += fp.toString()+"\n";
+ }
+ return ret;
+ }
+}
+