FileDocCategorySizeDatePackage
LocaleTorrentUtil.javaAPI DocAzureus 3.0.3.410090Tue May 30 23:09:48 BST 2006org.gudy.azureus2.core3.internat

LocaleTorrentUtil

public class LocaleTorrentUtil extends Object
Locale functions specific to Torrents.
note
Moved from LocaleUtil to keep (cyclical) dependencies down.

Fields Summary
private static List
listeners
Constructors Summary
Methods Summary
public static voidaddListener(LocaleUtilListener l)

		listeners.add(l);
	
public static java.lang.StringgetCurrentTorrentEncoding(org.gudy.azureus2.core3.torrent.TOTorrent torrent)

		return (torrent.getAdditionalStringProperty("encoding"));
	
protected static LocaleUtilDecoderCandidate[]getTorrentCandidates(org.gudy.azureus2.core3.torrent.TOTorrent torrent)
Checks the Torrent's text fields (path, comment, etc) against a list of locals, returning only those that can handle all the fields.

param
torrent
return
throws
TOTorrentException
throws
UnsupportedEncodingException

		long lMinCandidates;
		byte[] minCandidatesArray;

		Set cand_set = new HashSet();
		LocaleUtil localeUtil = LocaleUtil.getSingleton();

		List candidateDecoders = localeUtil.getCandidateDecoders(torrent.getName());
		lMinCandidates = candidateDecoders.size();
		minCandidatesArray = torrent.getName();

		cand_set.addAll(candidateDecoders);

		TOTorrentFile[] files = torrent.getFiles();

		for (int i = 0; i < files.length; i++) {

			TOTorrentFile file = files[i];

			byte[][] comps = file.getPathComponents();

			for (int j = 0; j < comps.length; j++) {
				candidateDecoders = localeUtil.getCandidateDecoders(comps[j]);
				if (candidateDecoders.size() < lMinCandidates) {
					lMinCandidates = candidateDecoders.size();
					minCandidatesArray = comps[j];
				}
				cand_set.retainAll(candidateDecoders);
			}
		}

		byte[] comment = torrent.getComment();

		if (comment != null) {
			candidateDecoders = localeUtil.getCandidateDecoders(comment);
			if (candidateDecoders.size() < lMinCandidates) {
				lMinCandidates = candidateDecoders.size();
				minCandidatesArray = comment;
			}
			cand_set.retainAll(candidateDecoders);
		}

		byte[] created = torrent.getCreatedBy();

		if (created != null) {
			candidateDecoders = localeUtil.getCandidateDecoders(created);
			if (candidateDecoders.size() < lMinCandidates) {
				lMinCandidates = candidateDecoders.size();
				minCandidatesArray = created;
			}
			cand_set.retainAll(candidateDecoders);
		}

		List candidatesList = localeUtil.getCandidatesAsList(minCandidatesArray);
		LocaleUtilDecoderCandidate[] candidates;
		candidates = new LocaleUtilDecoderCandidate[candidatesList.size()];
		candidatesList.toArray(candidates);

		Arrays.sort(candidates, new Comparator() {
			public int compare(Object o1, Object o2) {
				LocaleUtilDecoderCandidate luc1 = (LocaleUtilDecoderCandidate) o1;
				LocaleUtilDecoderCandidate luc2 = (LocaleUtilDecoderCandidate) o2;

				return (luc1.getDecoder().getIndex() - luc2.getDecoder().getIndex());
			}
		});

		return candidates;
	
public static LocaleUtilDecodergetTorrentEncoding(org.gudy.azureus2.core3.torrent.TOTorrent torrent)
Get the torrent's encoding, prompting the user to choose from a list if needed.

param
torrent Torrent to get encoding of
return
LocaleUtilDecoder that the torrent is in
throws
TOTorrentException
throws
UnsupportedEncodingException

		String encoding = torrent.getAdditionalStringProperty("encoding");

		// we can only persist the torrent if it has a filename defined for it

		boolean bSaveToFile;

		try {
			TorrentUtils.getTorrentFileName(torrent);

			bSaveToFile = true;

		} catch (Throwable e) {

			bSaveToFile = false;
		}

		if (encoding != null) {

			// get canonical name

			try {
				LocaleUtilDecoder[] all_decoders = LocaleUtil.getSingleton().getDecoders();
				LocaleUtilDecoder fallback_decoder = LocaleUtil.getSingleton().getFallBackDecoder();

				String canonical_name = encoding.equals(fallback_decoder.getName())
						? encoding : Charset.forName(encoding).name();

				for (int i = 0; i < all_decoders.length; i++) {

					if (all_decoders[i].getName().equals(canonical_name)) {

						return (all_decoders[i]);
					}
				}
			} catch (Throwable e) {

				Debug.printStackTrace(e);
			}
		}

		// get the decoders valid for various localisable parts of torrent content
		// not in any particular order

		LocaleUtilDecoderCandidate[] candidates = getTorrentCandidates(torrent);

		boolean system_decoder_is_valid = false;

		LocaleUtil localeUtil = LocaleUtil.getSingleton();
		LocaleUtilDecoder system_decoder = localeUtil.getSystemDecoder();
		for (int i = 0; i < candidates.length; i++) {
			if (candidates[i].getDecoder() == system_decoder) {
				system_decoder_is_valid = true;
				break;
			}
		}

		LocaleUtilDecoder selected_decoder = null;

		for (int i = 0; i < listeners.size(); i++) {

			LocaleUtilDecoderCandidate candidate = null;
			try {
				candidate = ((LocaleUtilListener) listeners.get(i)).selectDecoder(
						localeUtil, torrent, candidates);
			} catch (LocaleUtilEncodingException e) {
			}

			if (candidate != null) {

				selected_decoder = candidate.getDecoder();

				break;
			}

			bSaveToFile = false;
		}

		if (selected_decoder == null) {

			// go for system decoder, if valid, fallback if not

			if (system_decoder_is_valid) {

				selected_decoder = localeUtil.getSystemDecoder();

			} else {

				selected_decoder = localeUtil.getFallBackDecoder();
			}
		}

		torrent.setAdditionalStringProperty("encoding", selected_decoder.getName());

		if (bSaveToFile) {
			TorrentUtils.writeToFile(torrent);
		}

		return (selected_decoder);
	
public static LocaleUtilDecodergetTorrentEncodingIfAvailable(org.gudy.azureus2.core3.torrent.TOTorrent torrent)
Retrieves the encoding of the torrent if it can be determined.
Does not prompt the user with choices.

param
torrent Torrent to get encoding of
return
Locale torrent is in
throws
TOTorrentException
throws
UnsupportedEncodingException


	                                     	 
	   
			 

		  
	
		String encoding = torrent.getAdditionalStringProperty("encoding");
		
		if (encoding == null) {
			return null;
		}

		// get canonical name

		String canonical_name;

		try {
			canonical_name = Charset.forName(encoding).name();

		} catch (Throwable e) {

			canonical_name = encoding;
		}

		LocaleUtilDecoder chosenDecoder = null;
		LocaleUtilDecoder[] all_decoders = LocaleUtil.getSingleton().getDecoders();

		for (int i = 0; i < all_decoders.length; i++) {
			if (all_decoders[i].getName().equals(canonical_name)) {
				chosenDecoder = all_decoders[i];
				break;
			}
		}
		
		return chosenDecoder;
	
public static voidremoveListener(LocaleUtilListener l)

		listeners.remove(l);
	
public static voidsetDefaultTorrentEncoding(org.gudy.azureus2.core3.torrent.TOTorrent torrent)

		setTorrentEncoding(torrent, Constants.DEFAULT_ENCODING);
	
public static voidsetTorrentEncoding(org.gudy.azureus2.core3.torrent.TOTorrent torrent, java.lang.String encoding)

		try {
			LocaleUtil localeUtil = LocaleUtil.getSingleton();
			LocaleUtilDecoderCandidate[] candidates = getTorrentCandidates(torrent);

			String canonical_requested_name;

			// "System" means use the system encoding

			if (encoding.equalsIgnoreCase("system")) {

				canonical_requested_name = localeUtil.getSystemEncoding();

			} else if (encoding.equalsIgnoreCase(LocaleUtilDecoderFallback.NAME)) {

				canonical_requested_name = LocaleUtilDecoderFallback.NAME;

			} else {

				CharsetDecoder requested_decoder = Charset.forName(encoding).newDecoder();

				canonical_requested_name = requested_decoder.charset().name();
			}

			boolean ok = false;

			for (int i = 0; i < candidates.length; i++) {

				if (candidates[i].getDecoder().getName().equals(
						canonical_requested_name)) {

					ok = true;

					break;
				}
			}

			if (!ok) {

				String[] charsets = new String[candidates.length];
				String[] names = new String[candidates.length];

				for (int i = 0; i < candidates.length; i++) {

					LocaleUtilDecoder decoder = candidates[i].getDecoder();

					charsets[i] = decoder.getName();
					names[i] = decoder.decodeString(torrent.getName());
				}

				throw (new LocaleUtilEncodingException(charsets, names));
			}

			torrent.setAdditionalStringProperty("encoding", canonical_requested_name);

		} catch (Throwable e) {

			if (e instanceof LocaleUtilEncodingException) {

				throw ((LocaleUtilEncodingException) e);
			}

			throw (new LocaleUtilEncodingException(e));
		}