package carnero.cgeo.original.libs; import android.util.Log; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.entity.BufferedHttpEntity; import org.apache.http.impl.client.DefaultHttpClient; public class MapImg { /** * in my tests the "no image available" image had 5470 bytes, while "street only" maps had at least 20000 bytes */ private static final int MIN_MAP_IMAGE_BYTES = 6000; private Settings settings = null; private String geocode = null; public MapImg(Settings settingsIn, String geocodeIn) { geocode = geocodeIn; settings = settingsIn; if (geocode != null && geocode.length() > 0) { final String dirName = settings.getStorage() + geocode + "/"; File dir = null; dir = new File(settings.getStorage()); if (dir.exists() == false) { dir.mkdirs(); } dir = new File(dirName); if (dir.exists() == false) { dir.mkdirs(); } dir = null; } } public void getDrawable(String url, int level) { if (url == null || url.length() == 0) { return; } if (geocode == null || geocode.length() == 0) { return; } final String fileName = settings.getStorage() + geocode + "/map_" + level; HttpClient client = null; HttpGet getMethod = null; HttpResponse httpResponse = null; HttpEntity entity = null; BufferedHttpEntity bufferedEntity = null; boolean ok = false; for (int i = 0; i < 3; i ++) { if (i > 0) Log.w(Settings.tag, "cgMapImg.getDrawable: Failed to download data, retrying. Attempt #" + (i + 1)); try { client = new DefaultHttpClient(); getMethod = new HttpGet(url); httpResponse = client.execute(getMethod); entity = httpResponse.getEntity(); // if image is to small, don't download and save, there is no map data for this zoom level long contentSize = entity.getContentLength(); if (contentSize > 0 && contentSize <= MIN_MAP_IMAGE_BYTES) { break; } bufferedEntity = new BufferedHttpEntity(entity); if (bufferedEntity != null) { InputStream is = (InputStream)bufferedEntity.getContent(); FileOutputStream fos = new FileOutputStream(fileName); int fileSize = 0; try { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = is.read(buffer)) != -1) { fos.write(buffer, 0, bytesRead); fileSize += bytesRead; } ok = true; } catch (IOException e) { Log.e(Settings.tag, "cgMapImg.getDrawable (saving to cache): " + e.toString()); } finally { is.close(); fos.flush(); fos.close(); } bufferedEntity = null; // delete image if it has no contents if (ok && fileSize < MIN_MAP_IMAGE_BYTES) { (new File(fileName)).delete(); } } if (ok == true) { break; } } catch (Exception e) { Log.e(Settings.tag, "cgMapImg.getDrawable (downloading from web): " + e.toString()); } } } }