/*
 * @(#)ServerFile.java
 *
 * This file is part of webCDwriter - Network CD Writing.
 *
 * Copyright (C) 2001-2004 Jörg P. M. Haeger
 *
 * webCDwriter is free software. See CDcreator.java for details.
 *
 * Jörg Haeger, 01.02.2001
 */

import java.io.*;

/**
 * A class to represent remote files.
 *
 * @version 20040317
 * @author Jörg P. M. Haeger
 */
class ServerFile extends File2 {
	public static final int DATA = 0, DIR = 1, MP3 = 2, OGG = 3, WAV = 4;

	private int type;
	private long len;
	private long seconds;

	public ServerFile(File parent, String child,
		int type, long len, long seconds) {
		super(parent, child);
		this.type = type;
		this.len = len;
		this.seconds = seconds;
	}

	public ServerFile(String pathname) {
		super(pathname);
		if (pathname.endsWith("/")) {
			type = DIR;
			len = 0;
		}
		else {
			Stat stat = new Stat();
			stat.run(pathname);
			type = stat.type;
			len = stat.len;
			seconds = stat.seconds;
		}
	}

	public boolean canRead() {
		return true;
	}

	public String getPath() {
		return super.getPath().replace(separatorChar, '/');
	}

	public long getSeconds() {
		return seconds;
	}

	public int getType() {
		return type;
	}

	public boolean isDirectory() {
		return type == DIR;
	}

	public long length() {
		return len;
	}

	public File[] listFiles() {
		List list = new List();
		list.run(getPath());

		String lines[] = list.getStrings();

		File[] files = new File[lines.length];
		for (int i = 0; i < files.length; i++) {
			try {
				StreamTokenizer tokenizer = new StreamTokenizer(
					new StringReader(lines[i]));
				tokenizer.resetSyntax();
				tokenizer.whitespaceChars(0, 32);
				tokenizer.wordChars(33, 255);

				if (tokenizer.nextToken() != tokenizer.TT_WORD)
					throw new Exception();

				int type = DATA;
				if (tokenizer.sval.equals("d"))
					type = DIR;

				if (tokenizer.nextToken() != tokenizer.TT_WORD)
					throw new Exception();
				long length = Long.parseLong(tokenizer.sval);

				if (tokenizer.nextToken() != tokenizer.TT_WORD)
					throw new Exception();
				String name = Command.removeEscChars(tokenizer.sval);

				long seconds = 0;
				if (tokenizer.nextToken() == tokenizer.TT_WORD) {
					boolean audio = true;
					if (tokenizer.sval.equals("MP3"))
						type = MP3;
					else
					if (tokenizer.sval.equals("OGG"))
						type = OGG;
					else
					if (tokenizer.sval.equals("WAV"))
						type = WAV;
					else
						audio = false;

					if (audio) {
						if (tokenizer.nextToken() != tokenizer.TT_WORD)
							throw new Exception();
						seconds = Long.parseLong(tokenizer.sval);
					}
				}

				files[i] = new ServerFile(
					this, name, type, length, seconds);
			}
			catch (Exception e) {
				files[i] = new ServerFile("Error");
			}
		}

		return files;
	}
}
