package com.nutiteq.maps; import javax.microedition.io.HttpConnection; import com.nutiteq.cache.Cache; import com.nutiteq.io.ResourceDataWaiter; import com.nutiteq.io.ResourceRequestor; import com.nutiteq.log.Log; import com.nutiteq.maps.projections.EPSG3785; import com.nutiteq.net.DataPostingDownloadable; import com.nutiteq.task.RetrieveNetworkResourceTask; import com.nutiteq.task.Task; import com.nutiteq.ui.Copyright; import com.nutiteq.ui.StringCopyright; /** * Map for using CloudMade maps (with tile size 64 and 256). */ public class CloudMade extends EPSG3785 implements GeoMap, UnstreamedMap { private static final String BASEURL = "http://tile.cloudmade.com/"; private static final String AUTHURL = "http://auth.cloudmade.com/"; private final String licenseKey; private final String userid; private String token; // not static. otherwise user cannot change with new instance private final int mapLayout; public static final int TILE_SIZE_64 = 64; public static final int TILE_SIZE_256 = 256; private static final int MIN_ZOOM = 0; private static final int MAX_ZOOM_256 = 18; private static final int MAX_ZOOM_64 = 20; /** * Constructor for CloudMade map. * * @param licenseKey * license key issued by CloudMade * @param tileSize * used tile size (64 or 256) * @param mapLayout * used map layout (currently only 1 is supported by CloudMade) */ public CloudMade(final String licenseKey, final String userid, final int tileSize, final int mapLayout) { this(new StringCopyright("CloudMade"), licenseKey, userid, tileSize, mapLayout); } public CloudMade(final Copyright copyright, final String licenseKey, final String userid, final int tileSize, final int mapLayout) { super(copyright, tileSize, MIN_ZOOM, tileSize == TILE_SIZE_64 ? MAX_ZOOM_64 : MAX_ZOOM_256); this.licenseKey = licenseKey; this.userid = userid; this.mapLayout = mapLayout; this.token = null; } public String buildPath(final int mapX, final int mapY, final int zoom) { final StringBuffer result = new StringBuffer(BASEURL); result.append(licenseKey); result.append("/"); result.append(mapLayout); result.append("/"); result.append(getTileSize()); result.append("/"); result.append(zoom); result.append('/'); result.append(mapX / getTileSize()& ((1 << zoom) - 1)); result.append('/'); result.append(mapY / getTileSize()); result.append(".png?token=").append(token); return result.toString(); } /** * @return CloudMade token, usable for other services */ public String getCloudMadeToken(){ return token; } public Task getInitializationTask() { if (token == null) { CloudMadeTokenRequest req = new CloudMadeTokenRequest(); return new RetrieveNetworkResourceTask(req, null, req.getCachingLevel()); } return null; } private class CloudMadeTokenRequest implements DataPostingDownloadable, ResourceRequestor, ResourceDataWaiter { public String getContentType() { return "application/x-www-form-urlencoded"; } public String getPostContent() { return "apikey=" + licenseKey + "&userid=" + userid; } public String getUrl() { return AUTHURL + "token/" + licenseKey; } public void notifyError() { Log.error("CloudMade token request failed!"); } public int getCachingLevel() { return Cache.CACHE_LEVEL_NONE; } public String resourcePath() { return getUrl(); // not used for DataPostingDownloadable } public void dataRetrieved(byte[] data) { token = new String(data); Log.debug("CloudMade token = "+token); } public String getRequestMethod() { return HttpConnection.POST; } } }