// Path: android-reader/src/main/java/net/vhati/openuhs/androidreader/downloader/FetchUnitException.java
// public class FetchUnitException extends Exception {
// 
// 
//     public FetchUnitException() {
// 	}
// 
// 	public FetchUnitException( String message ) {
// 		super(message);
// 	}
// 
// 	public FetchUnitException( Throwable cause ) {
// 		super( cause );
// 	}
// 
// 	public FetchUnitException( String message, Throwable cause ) {
// 		super( message, cause );
// 	}
// }
// 
// Path: core/src/main/java/net/vhati/openuhs/core/downloader/CatalogItem.java
// public class CatalogItem {
// 	private String title = "";
// 	private String url = "";
// 	private String name = "";
// 	private Date date = null;
// 	private String compressedSize = "";
// 	private String fullSize = "";
// 
// 	private boolean stateLocal = false;
// 	private boolean stateNewer = false;
// 
// 
// 	public CatalogItem() {
// 	}
// 
// 
// 	public void setTitle( String s ) {
// 		title = (( s != null ) ? s : "");
// 	}
// 
// 	public String getTitle() {
// 		return title;
// 	}
// 
// 	public void setUrl( String s ) {
// 		url = (( s != null ) ? s : "");
// 	}
// 
// 	public String getUrl() {
// 		return url;
// 	}
// 
// 	public void setName( String s ) {
// 		name = (( s != null ) ? s : "");
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	public void setDate( Date d ) {
// 		date = d;
// 	}
// 
// 	public Date getDate() {
// 		return date;
// 	}
// 
// 	/**
// 	 * Sets the reported size of the zip file that wraps the UHS file.
// 	 */
// 	public void setCompressedSize( String s ) {
// 		compressedSize = (( s != null ) ? s : "");
// 	}
// 
// 	public String getCompressedSize() {
// 		return compressedSize;
// 	}
// 
// 	/**
// 	 * Sets the reported size of the UHS file, once extracted from the zip file.
// 	 */
// 	public void setFullSize( String s ) {
// 		fullSize = (( s != null ) ? s : "");
// 	}
// 
// 	public String getFullSize() {
// 		return fullSize;
// 	}
// 
// 
// 	/**
// 	 * Sets whether there is a local file with this catalog entry's name.
// 	 *
// 	 * @see #resetState()
// 	 */
// 	public void setLocal( boolean b ) {
// 		stateLocal = b;
// 	}
// 
// 	public boolean isLocal() {
// 		return stateLocal;
// 	}
// 
// 	/**
// 	 * Sets whether the catalog entry is newer than the local file.
// 	 *
// 	 * @see #resetState()
// 	 */
// 	public void setNewer( boolean b ) {
// 		stateNewer = b;
// 	}
// 
// 	public boolean isNewer() {
// 		return stateNewer;
// 	}
// 
// 	/**
// 	 * Resets the catalog-vs-local state flage.
// 	 *
// 	 * @see #setLocal(boolean)
// 	 * @see #setNewer(boolean)
// 	 */
// 	public void resetState() {
// 		setLocal( false );
// 		setNewer( false );
// 	}
// 
// 
// 	@Override
// 	public String toString() {
// 		return getTitle();
// 	}
// }


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipEntry;
import android.os.AsyncTask;
import net.vhati.openuhs.androidreader.downloader.FetchUnitException;
import net.vhati.openuhs.core.downloader.CatalogItem;

	public void setUserAgent( String s ) {
		this.userAgent = s;
	}

	public String getUserAgent() {
		return userAgent;
	}


	// This runs in a background thread, unlike the other methods here.
	@Override
	protected UHSFetchResult doInBackground( CatalogItem... catItems ) {
		CatalogItem catItem = catItems[0];
		UHSFetchResult fetchResult = new UHSFetchResult( catItem );

		HttpURLConnection con = null;
		InputStream downloadStream = null;
		ZipInputStream unzipStream = null;
		OutputStream os = null;
		File uhsFile = null;

		String urlString = catItem.getUrl();
		Exception ex = null;
		try {
			con = (HttpURLConnection)(new URL( urlString ).openConnection());
			con.setRequestProperty( "User-Agent", userAgent );
			con.connect();

			if ( con.getResponseCode() != HttpURLConnection.HTTP_OK ) {
// Path: android-reader/src/main/java/net/vhati/openuhs/androidreader/downloader/FetchUnitException.java
// public class FetchUnitException extends Exception {
// 
// 
//     public FetchUnitException() {
// 	}
// 
// 	public FetchUnitException( String message ) {
// 		super(message);
// 	}
// 
// 	public FetchUnitException( Throwable cause ) {
// 		super( cause );
// 	}
// 
// 	public FetchUnitException( String message, Throwable cause ) {
// 		super( message, cause );
// 	}
// }
// 
// Path: core/src/main/java/net/vhati/openuhs/core/downloader/CatalogItem.java
// public class CatalogItem {
// 	private String title = "";
// 	private String url = "";
// 	private String name = "";
// 	private Date date = null;
// 	private String compressedSize = "";
// 	private String fullSize = "";
// 
// 	private boolean stateLocal = false;
// 	private boolean stateNewer = false;
// 
// 
// 	public CatalogItem() {
// 	}
// 
// 
// 	public void setTitle( String s ) {
// 		title = (( s != null ) ? s : "");
// 	}
// 
// 	public String getTitle() {
// 		return title;
// 	}
// 
// 	public void setUrl( String s ) {
// 		url = (( s != null ) ? s : "");
// 	}
// 
// 	public String getUrl() {
// 		return url;
// 	}
// 
// 	public void setName( String s ) {
// 		name = (( s != null ) ? s : "");
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	public void setDate( Date d ) {
// 		date = d;
// 	}
// 
// 	public Date getDate() {
// 		return date;
// 	}
// 
// 	/**
// 	 * Sets the reported size of the zip file that wraps the UHS file.
// 	 */
// 	public void setCompressedSize( String s ) {
// 		compressedSize = (( s != null ) ? s : "");
// 	}
// 
// 	public String getCompressedSize() {
// 		return compressedSize;
// 	}
// 
// 	/**
// 	 * Sets the reported size of the UHS file, once extracted from the zip file.
// 	 */
// 	public void setFullSize( String s ) {
// 		fullSize = (( s != null ) ? s : "");
// 	}
// 
// 	public String getFullSize() {
// 		return fullSize;
// 	}
// 
// 
// 	/**
// 	 * Sets whether there is a local file with this catalog entry's name.
// 	 *
// 	 * @see #resetState()
// 	 */
// 	public void setLocal( boolean b ) {
// 		stateLocal = b;
// 	}
// 
// 	public boolean isLocal() {
// 		return stateLocal;
// 	}
// 
// 	/**
// 	 * Sets whether the catalog entry is newer than the local file.
// 	 *
// 	 * @see #resetState()
// 	 */
// 	public void setNewer( boolean b ) {
// 		stateNewer = b;
// 	}
// 
// 	public boolean isNewer() {
// 		return stateNewer;
// 	}
// 
// 	/**
// 	 * Resets the catalog-vs-local state flage.
// 	 *
// 	 * @see #setLocal(boolean)
// 	 * @see #setNewer(boolean)
// 	 */
// 	public void resetState() {
// 		setLocal( false );
// 		setNewer( false );
// 	}
// 
// 
// 	@Override
// 	public String toString() {
// 		return getTitle();
// 	}
// }


// Path: android-reader/src/main/java/net/vhati/openuhs/androidreader/downloader/UHSFetchTask.java
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipEntry;
import android.os.AsyncTask;
import net.vhati.openuhs.androidreader.downloader.FetchUnitException;
import net.vhati.openuhs.core.downloader.CatalogItem;


	public void setUserAgent( String s ) {
		this.userAgent = s;
	}

	public String getUserAgent() {
		return userAgent;
	}


	// This runs in a background thread, unlike the other methods here.
	@Override
	protected UHSFetchResult doInBackground( CatalogItem... catItems ) {
		CatalogItem catItem = catItems[0];
		UHSFetchResult fetchResult = new UHSFetchResult( catItem );

		HttpURLConnection con = null;
		InputStream downloadStream = null;
		ZipInputStream unzipStream = null;
		OutputStream os = null;
		File uhsFile = null;

		String urlString = catItem.getUrl();
		Exception ex = null;
		try {
			con = (HttpURLConnection)(new URL( urlString ).openConnection());
			con.setRequestProperty( "User-Agent", userAgent );
			con.connect();

			if ( con.getResponseCode() != HttpURLConnection.HTTP_OK ) {
				throw new FetchUnitException( "Server returned HTTP "+ con.getResponseCode() +" "+ con.getResponseMessage() );