diff options
author | Andrei Popescu <andreip@google.com> | 2009-08-13 11:59:57 +0100 |
---|---|---|
committer | Andrei Popescu <andreip@google.com> | 2009-08-13 13:07:48 +0100 |
commit | 385df699a6d602cab501092821a79cc6ab3a390e (patch) | |
tree | 06e4c6f8f129c9350a8798d9e41f7384c8b5f4f5 | |
parent | 25660ec2c8175559d86d50bc2bfdef29589d0813 (diff) | |
download | frameworks_base-385df699a6d602cab501092821a79cc6ab3a390e.zip frameworks_base-385df699a6d602cab501092821a79cc6ab3a390e.tar.gz frameworks_base-385df699a6d602cab501092821a79cc6ab3a390e.tar.bz2 |
remove Gears
21 files changed, 174 insertions, 2969 deletions
diff --git a/api/current.xml b/api/current.xml index 2777210..8682b15 100644 --- a/api/current.xml +++ b/api/current.xml @@ -162798,14 +162798,14 @@ abstract="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <constructor name="Plugin" type="android.webkit.Plugin" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <parameter name="name" type="java.lang.String"> @@ -162824,7 +162824,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <parameter name="context" type="android.content.Context"> @@ -162837,7 +162837,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </method> @@ -162848,7 +162848,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </method> @@ -162859,7 +162859,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </method> @@ -162870,7 +162870,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </method> @@ -162881,7 +162881,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <parameter name="handler" type="android.webkit.Plugin.PreferencesClickHandler"> @@ -162894,7 +162894,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <parameter name="description" type="java.lang.String"> @@ -162907,7 +162907,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <parameter name="fileName" type="java.lang.String"> @@ -162920,7 +162920,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <parameter name="name" type="java.lang.String"> @@ -162933,7 +162933,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <parameter name="path" type="java.lang.String"> @@ -162966,14 +162966,14 @@ abstract="false" static="false" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <constructor name="PluginData" type="android.webkit.PluginData" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <parameter name="stream" type="java.io.InputStream"> @@ -162992,7 +162992,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </method> @@ -163003,7 +163003,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </method> @@ -163014,7 +163014,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </method> @@ -163025,7 +163025,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </method> @@ -163035,14 +163035,14 @@ abstract="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <constructor name="PluginList" type="android.webkit.PluginList" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </constructor> @@ -163053,7 +163053,7 @@ synchronized="true" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <parameter name="plugin" type="android.webkit.Plugin"> @@ -163066,7 +163066,7 @@ synchronized="true" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </method> @@ -163077,7 +163077,7 @@ synchronized="true" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </method> @@ -163088,7 +163088,7 @@ synchronized="true" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <parameter name="context" type="android.content.Context"> @@ -163103,7 +163103,7 @@ synchronized="true" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <parameter name="plugin" type="android.webkit.Plugin"> @@ -163380,7 +163380,7 @@ abstract="true" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <method name="getPluginData" @@ -163390,7 +163390,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <parameter name="url" type="java.lang.String"> @@ -163419,7 +163419,7 @@ abstract="false" static="false" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <constructor name="UrlInterceptRegistry" @@ -163437,7 +163437,7 @@ synchronized="true" static="true" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <parameter name="url" type="java.lang.String"> @@ -163467,7 +163467,7 @@ synchronized="true" static="true" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <parameter name="handler" type="android.webkit.UrlInterceptHandler"> @@ -163480,7 +163480,7 @@ synchronized="true" static="true" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <parameter name="disabled" type="boolean"> @@ -163493,7 +163493,7 @@ synchronized="true" static="true" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <parameter name="handler" type="android.webkit.UrlInterceptHandler"> @@ -163506,7 +163506,7 @@ synchronized="true" static="true" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </method> @@ -165500,7 +165500,7 @@ synchronized="true" static="true" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </method> @@ -165793,7 +165793,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > <parameter name="reloadOpenPages" type="boolean"> diff --git a/core/java/android/webkit/FrameLoader.java b/core/java/android/webkit/FrameLoader.java index e7978ac..81ed367 100644 --- a/core/java/android/webkit/FrameLoader.java +++ b/core/java/android/webkit/FrameLoader.java @@ -160,9 +160,6 @@ class FrameLoader { populateStaticHeaders(); populateHeaders(); - // response was handled by UrlIntercept, don't issue HTTP request - if (handleUrlIntercept()) return true; - // response was handled by Cache, don't issue HTTP request if (handleCache()) { // push the request data down to the LoadListener @@ -200,7 +197,7 @@ class FrameLoader { } /* - * This function is used by handleUrlInterecpt and handleCache to + * This function is used by handleCache to * setup a load from the byte stream in a CacheResult. */ private void startCacheLoad(CacheResult result) { @@ -216,30 +213,6 @@ class FrameLoader { } /* - * This function is used by handleHTTPLoad to allow URL - * interception. This can be used to provide alternative load - * methods such as locally stored versions or for debugging. - * - * Returns true if the response was handled by UrlIntercept. - */ - private boolean handleUrlIntercept() { - // Check if the URL can be served from UrlIntercept. If - // successful, return the data just like a cache hit. - - PluginData data = UrlInterceptRegistry.getPluginData( - mListener.url(), mHeaders); - - if(data != null) { - PluginContentLoader loader = - new PluginContentLoader(mListener, data); - loader.load(); - return true; - } - // Not intercepted. Carry on as normal. - return false; - } - - /* * This function is used by the handleHTTPLoad to setup the cache headers * correctly. * Returns true if the response was handled from the cache diff --git a/core/java/android/webkit/Plugin.java b/core/java/android/webkit/Plugin.java index f83da99..302bea2 100644 --- a/core/java/android/webkit/Plugin.java +++ b/core/java/android/webkit/Plugin.java @@ -26,7 +26,11 @@ import android.webkit.WebView; /** * Represents a plugin (Java equivalent of the PluginPackageAndroid * C++ class in libs/WebKitLib/WebKit/WebCore/plugins/android/) + * + * @deprecated This interface was inteded to be used by Gears. Since Gears was + * deprecated, so is this class. */ +@Deprecated public class Plugin { public interface PreferencesClickHandler { public void handleClickEvent(Context context); @@ -38,6 +42,10 @@ public class Plugin { private String mDescription; private PreferencesClickHandler mHandler; + /** + * @deprecated + */ + @Deprecated public Plugin(String name, String path, String fileName, @@ -49,49 +57,92 @@ public class Plugin { mHandler = new DefaultClickHandler(); } + /** + * @deprecated + */ + @Deprecated public String toString() { return mName; } + /** + * @deprecated + */ + @Deprecated public String getName() { return mName; } + /** + * @deprecated + */ + @Deprecated public String getPath() { return mPath; } + /** + * @deprecated + */ + @Deprecated public String getFileName() { return mFileName; } + /** + * @deprecated + */ + @Deprecated public String getDescription() { return mDescription; } + /** + * @deprecated + */ + @Deprecated public void setName(String name) { mName = name; } + /** + * @deprecated + */ + @Deprecated public void setPath(String path) { mPath = path; } + /** + * @deprecated + */ + @Deprecated public void setFileName(String fileName) { mFileName = fileName; } + /** + * @deprecated + */ + @Deprecated public void setDescription(String description) { mDescription = description; } + /** + * @deprecated + */ + @Deprecated public void setClickHandler(PreferencesClickHandler handler) { mHandler = handler; } /** * Invokes the click handler for this plugin. + * + * @deprecated */ + @Deprecated public void dispatchClickEvent(Context context) { if (mHandler != null) { mHandler.handleClickEvent(context); @@ -100,11 +151,14 @@ public class Plugin { /** * Default click handler. The plugins should implement their own. + * + * @deprecated */ + @Deprecated private class DefaultClickHandler implements PreferencesClickHandler, DialogInterface.OnClickListener { private AlertDialog mDialog; - + @Deprecated public void handleClickEvent(Context context) { // Show a simple popup dialog containing the description // string of the plugin. @@ -117,7 +171,10 @@ public class Plugin { .show(); } } - + /** + * @deprecated + */ + @Deprecated public void onClick(DialogInterface dialog, int which) { mDialog.dismiss(); mDialog = null; diff --git a/core/java/android/webkit/PluginContentLoader.java b/core/java/android/webkit/PluginContentLoader.java deleted file mode 100644 index 2069599..0000000 --- a/core/java/android/webkit/PluginContentLoader.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.webkit; - -import android.net.http.Headers; - -import java.io.InputStream; -import java.util.*; - -import org.apache.http.util.CharArrayBuffer; - -/** - * This class is a concrete implementation of StreamLoader that uses a - * PluginData object as the source for the stream. - */ -class PluginContentLoader extends StreamLoader { - - private PluginData mData; // Content source - - /** - * Constructs a PluginDataLoader for use when loading content from - * a plugin. - * - * @param loadListener LoadListener to pass the content to - * @param data PluginData used as the source for the content. - */ - PluginContentLoader(LoadListener loadListener, PluginData data) { - super(loadListener); - mData = data; - } - - @Override - protected boolean setupStreamAndSendStatus() { - mDataStream = mData.getInputStream(); - mContentLength = mData.getContentLength(); - mHandler.status(1, 1, mData.getStatusCode(), "OK"); - return true; - } - - @Override - protected void buildHeaders(Headers headers) { - // Crate a CharArrayBuffer with an arbitrary initial capacity. - CharArrayBuffer buffer = new CharArrayBuffer(100); - Iterator<Map.Entry<String, String[]>> responseHeadersIt = - mData.getHeaders().entrySet().iterator(); - while (responseHeadersIt.hasNext()) { - Map.Entry<String, String[]> entry = responseHeadersIt.next(); - // Headers.parseHeader() expects lowercase keys, so keys - // such as "Accept-Ranges" will fail to parse. - // - // UrlInterceptHandler instances supply a mapping of - // lowercase key to [ unmodified key, value ], so for - // Headers.parseHeader() to succeed, we need to construct - // a string using the key (i.e. entry.getKey()) and the - // element denoting the header value in the - // [ unmodified key, value ] pair (i.e. entry.getValue()[1). - // - // The reason why UrlInterceptHandler instances supply such a - // mapping in the first place is historical. Early versions of - // the Gears plugin used java.net.HttpURLConnection, which always - // returned headers names as capitalized strings. When these were - // fed back into webkit, they failed to parse. - // - // Mewanwhile, Gears was modified to use Apache HTTP library - // instead, so this design is now obsolete. Changing it however, - // would require changes to the Gears C++ codebase and QA-ing and - // submitting a new binary to the Android tree. Given the - // timelines for the next Android release, we will not do this - // for now. - // - // TODO: fix C++ Gears to remove the need for this - // design. - String keyValue = entry.getKey() + ": " + entry.getValue()[1]; - buffer.ensureCapacity(keyValue.length()); - buffer.append(keyValue); - // Parse it into the header container. - headers.parseHeader(buffer); - // Clear the buffer - buffer.clear(); - } - } -} diff --git a/core/java/android/webkit/PluginData.java b/core/java/android/webkit/PluginData.java index 02be1f7..d9b196a 100644 --- a/core/java/android/webkit/PluginData.java +++ b/core/java/android/webkit/PluginData.java @@ -28,7 +28,10 @@ import java.util.Map; * status code. The PluginData class is the container for all these * parts. * + * @deprecated This class was inteded to be used by Gears. Since Gears was + * deprecated, so is this class. */ +@Deprecated public final class PluginData { /** * The content stream. @@ -59,7 +62,10 @@ public final class PluginData { * @param headers The response headers. Map of * lowercase header name to [ unmodified header name, header value] * @param length The HTTP response status code. + * + * @deprecated */ + @Deprecated public PluginData( InputStream stream, long length, @@ -75,7 +81,10 @@ public final class PluginData { * Returns the input stream that contains the plugin content. * * @return An InputStream instance with the plugin content. + * + * @deprecated */ + @Deprecated public InputStream getInputStream() { return mStream; } @@ -84,7 +93,10 @@ public final class PluginData { * Returns the length of the plugin content. * * @return the length of the plugin content. + * + * @deprecated */ + @Deprecated public long getContentLength() { return mContentLength; } @@ -96,7 +108,10 @@ public final class PluginData { * @return A Map<String, String[]> containing all headers. The * mapping is 'lowercase header name' to ['unmodified header * name', header value]. + * + * @deprecated */ + @Deprecated public Map<String, String[]> getHeaders() { return mHeaders; } @@ -105,7 +120,10 @@ public final class PluginData { * Returns the HTTP status code for the response. * * @return The HTTP statue code, e.g 200. + * + * @deprecated */ + @Deprecated public int getStatusCode() { return mStatusCode; } diff --git a/core/java/android/webkit/PluginList.java b/core/java/android/webkit/PluginList.java index a9d3d8c..5b65b9a 100644 --- a/core/java/android/webkit/PluginList.java +++ b/core/java/android/webkit/PluginList.java @@ -24,27 +24,40 @@ import java.util.List; * A simple list of initialized plugins. This list gets * populated when the plugins are initialized (at * browser startup, at the moment). + * + * @deprecated This interface was inteded to be used by Gears. Since Gears was + * deprecated, so is this class. */ +@Deprecated public class PluginList { private ArrayList<Plugin> mPlugins; /** * Public constructor. Initializes the list of plugins. + * + * @deprecated */ + @Deprecated public PluginList() { mPlugins = new ArrayList<Plugin>(); } /** * Returns the list of plugins as a java.util.List. + * + * @deprecated */ + @Deprecated public synchronized List getList() { return mPlugins; } /** * Adds a plugin to the list. + * + * @deprecated */ + @Deprecated public synchronized void addPlugin(Plugin plugin) { if (!mPlugins.contains(plugin)) { mPlugins.add(plugin); @@ -53,7 +66,10 @@ public class PluginList { /** * Removes a plugin from the list. + * + * @deprecated */ + @Deprecated public synchronized void removePlugin(Plugin plugin) { int location = mPlugins.indexOf(plugin); if (location != -1) { @@ -63,14 +79,20 @@ public class PluginList { /** * Clears the plugin list. + * + * @deprecated */ + @Deprecated public synchronized void clear() { mPlugins.clear(); } /** * Dispatches the click event to the appropriate plugin. + * + * @deprecated */ + @Deprecated public synchronized void pluginClicked(Context context, int position) { try { Plugin plugin = mPlugins.get(position); diff --git a/core/java/android/webkit/UrlInterceptHandler.java b/core/java/android/webkit/UrlInterceptHandler.java index 9216413..78bab04 100644 --- a/core/java/android/webkit/UrlInterceptHandler.java +++ b/core/java/android/webkit/UrlInterceptHandler.java @@ -20,6 +20,11 @@ import android.webkit.CacheManager.CacheResult; import android.webkit.PluginData; import java.util.Map; +/** + * @deprecated This interface was inteded to be used by Gears. Since Gears was + * deprecated, so is this class. + */ +@Deprecated public interface UrlInterceptHandler { /** @@ -30,8 +35,8 @@ public interface UrlInterceptHandler { * @param url URL string. * @param headers The headers associated with the request. May be null. * @return The CacheResult containing the surrogate response. - * @Deprecated Use PluginData getPluginData(String url, - * Map<String, String> headers); instead + * + * @deprecated Do not use, this interface is deprecated. */ @Deprecated public CacheResult service(String url, Map<String, String> headers); @@ -44,6 +49,9 @@ public interface UrlInterceptHandler { * @param url URL string. * @param headers The headers associated with the request. May be null. * @return The PluginData containing the surrogate response. + * + * @deprecated Do not use, this interface is deprecated. */ + @Deprecated public PluginData getPluginData(String url, Map<String, String> headers); } diff --git a/core/java/android/webkit/UrlInterceptRegistry.java b/core/java/android/webkit/UrlInterceptRegistry.java index 6051f29..6e2a482 100644 --- a/core/java/android/webkit/UrlInterceptRegistry.java +++ b/core/java/android/webkit/UrlInterceptRegistry.java @@ -24,6 +24,11 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.Map; +/** + * @deprecated This class was inteded to be used by Gears. Since Gears was + * deprecated, so is this class. + */ +@Deprecated public final class UrlInterceptRegistry { private final static String LOGTAG = "intercept"; @@ -42,7 +47,10 @@ public final class UrlInterceptRegistry { * set the flag to control whether url intercept is enabled or disabled * * @param disabled true to disable the cache + * + * @deprecated */ + @Deprecated public static synchronized void setUrlInterceptDisabled(boolean disabled) { mDisabled = disabled; } @@ -51,7 +59,10 @@ public final class UrlInterceptRegistry { * get the state of the url intercept, enabled or disabled * * @return return if it is disabled + * + * @deprecated */ + @Deprecated public static synchronized boolean urlInterceptDisabled() { return mDisabled; } @@ -62,7 +73,10 @@ public final class UrlInterceptRegistry { * * @param handler The new UrlInterceptHandler object * @return true if the handler was not previously registered. + * + * @deprecated */ + @Deprecated public static synchronized boolean registerHandler( UrlInterceptHandler handler) { if (!getHandlers().contains(handler)) { @@ -78,7 +92,10 @@ public final class UrlInterceptRegistry { * * @param handler A previously registered UrlInterceptHandler. * @return true if the handler was found and removed from the list. + * + * @deprecated */ + @Deprecated public static synchronized boolean unregisterHandler( UrlInterceptHandler handler) { return getHandlers().remove(handler); @@ -89,8 +106,8 @@ public final class UrlInterceptRegistry { * UrlInterceptHandler interested, or null if none are. * * @return A CacheResult containing surrogate content. - * @Deprecated Use PluginData getPluginData( String url, - * Map<String, String> headers) instead. + * + * @deprecated */ @Deprecated public static synchronized CacheResult getSurrogate( @@ -115,7 +132,10 @@ public final class UrlInterceptRegistry { * intercepts are disabled. * * @return A PluginData instance containing surrogate content. + * + * @deprecated */ + @Deprecated public static synchronized PluginData getPluginData( String url, Map<String, String> headers) { if (urlInterceptDisabled()) { diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index cc7a228..41ef31c 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -306,9 +306,6 @@ public class WebView extends AbsoluteLayout // Used by WebViewCore to create child views. /* package */ final ViewManager mViewManager; - // The list of loaded plugins. - private static PluginList sPluginList; - /** * Position of the last touch event. */ @@ -2493,20 +2490,19 @@ public class WebView extends AbsoluteLayout /** * Return the list of currently loaded plugins. * @return The list of currently loaded plugins. + * + * @deprecated This was used for Gears, which has been deprecated. */ + @Deprecated public static synchronized PluginList getPluginList() { - if (sPluginList == null) { - sPluginList = new PluginList(); - } - return sPluginList; + return null; } /** - * TODO: need to add @Deprecated + * @deprecated This was used for Gears, which has been deprecated. */ - public void refreshPlugins(boolean reloadOpenPages) { - PluginManager.getInstance(mContext).refreshPlugins(reloadOpenPages); - } + @Deprecated + public void refreshPlugins(boolean reloadOpenPages) { } //------------------------------------------------------------------------- // Override View methods diff --git a/core/java/android/webkit/gears/AndroidGpsLocationProvider.java b/core/java/android/webkit/gears/AndroidGpsLocationProvider.java deleted file mode 100644 index 3646042..0000000 --- a/core/java/android/webkit/gears/AndroidGpsLocationProvider.java +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2008, The Android Open Source Project -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// 3. Neither the name of Google Inc. nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package android.webkit.gears; - -import android.content.Context; -import android.location.Location; -import android.location.LocationListener; -import android.location.LocationManager; -import android.location.LocationProvider; -import android.os.Bundle; -import android.util.Log; -import android.webkit.WebView; - -/** - * GPS provider implementation for Android. - */ -public final class AndroidGpsLocationProvider implements LocationListener { - /** - * Logging tag - */ - private static final String TAG = "Gears-J-GpsProvider"; - /** - * Our location manager instance. - */ - private LocationManager locationManager; - /** - * The native object ID. - */ - private long nativeObject; - - public AndroidGpsLocationProvider(WebView webview, long object) { - nativeObject = object; - locationManager = (LocationManager) webview.getContext().getSystemService( - Context.LOCATION_SERVICE); - if (locationManager == null) { - Log.e(TAG, - "AndroidGpsLocationProvider: could not get location manager."); - throw new NullPointerException( - "AndroidGpsLocationProvider: locationManager is null."); - } - // Register for location updates. - try { - locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, - this); - } catch (IllegalArgumentException ex) { - Log.e(TAG, - "AndroidLocationGpsProvider: could not register for updates: " + ex); - throw ex; - } catch (SecurityException ex) { - Log.e(TAG, - "AndroidGpsLocationProvider: not allowed to register for update: " - + ex); - throw ex; - } - } - - /** - * Called when the provider is no longer needed. - */ - public void shutdown() { - locationManager.removeUpdates(this); - Log.i(TAG, "GPS provider closed."); - } - - /** - * Called when the location has changed. - * @param location The new location, as a Location object. - */ - public void onLocationChanged(Location location) { - Log.i(TAG, "Location changed: " + location); - nativeLocationChanged(location, nativeObject); - } - - /** - * Called when the provider status changes. - * - * @param provider the name of the location provider associated with this - * update. - * @param status {@link LocationProvider#OUT_OF_SERVICE} if the - * provider is out of service, and this is not expected to change in the - * near future; {@link LocationProvider#TEMPORARILY_UNAVAILABLE} if - * the provider is temporarily unavailable but is expected to be available - * shortly; and {@link LocationProvider#AVAILABLE} if the - * provider is currently available. - * @param extras an optional Bundle which will contain provider specific - * status variables (such as number of satellites). - */ - public void onStatusChanged(String provider, int status, Bundle extras) { - Log.i(TAG, "Provider " + provider + " status changed to " + status); - if (status == LocationProvider.OUT_OF_SERVICE || - status == LocationProvider.TEMPORARILY_UNAVAILABLE) { - nativeProviderError(false, nativeObject); - } - } - - /** - * Called when the provider is enabled. - * - * @param provider the name of the location provider that is now enabled. - */ - public void onProviderEnabled(String provider) { - Log.i(TAG, "Provider " + provider + " enabled."); - // No need to notify the native side. It's enough to start sending - // valid position fixes again. - } - - /** - * Called when the provider is disabled. - * - * @param provider the name of the location provider that is now disabled. - */ - public void onProviderDisabled(String provider) { - Log.i(TAG, "Provider " + provider + " disabled."); - nativeProviderError(true, nativeObject); - } - - /** - * The native method called when a new location is available. - * @param location is the new Location instance to pass to the native side. - * @param nativeObject is a pointer to the corresponding - * AndroidGpsLocationProvider C++ instance. - */ - private native void nativeLocationChanged(Location location, long object); - - /** - * The native method called when there is a GPS provder error. - * @param isDisabled is true when the error signifies the fact that the GPS - * HW is disabled. For other errors, this param is always false. - * @param nativeObject is a pointer to the corresponding - * AndroidGpsLocationProvider C++ instance. - */ - private native void nativeProviderError(boolean isDisabled, long object); -} diff --git a/core/java/android/webkit/gears/AndroidRadioDataProvider.java b/core/java/android/webkit/gears/AndroidRadioDataProvider.java deleted file mode 100644 index 1384042..0000000 --- a/core/java/android/webkit/gears/AndroidRadioDataProvider.java +++ /dev/null @@ -1,260 +0,0 @@ -// Copyright 2008, The Android Open Source Project -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// 3. Neither the name of Google Inc. nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package android.webkit.gears; - -import android.content.Context; -import android.telephony.CellLocation; -import android.telephony.ServiceState; -import android.telephony.SignalStrength; -import android.telephony.gsm.GsmCellLocation; -import android.telephony.PhoneStateListener; -import android.telephony.TelephonyManager; -import android.util.Log; -import android.webkit.WebView; - -/** - * Radio data provider implementation for Android. - */ -public final class AndroidRadioDataProvider extends PhoneStateListener { - - /** Logging tag */ - private static final String TAG = "Gears-J-RadioProvider"; - - /** Network types */ - private static final int RADIO_TYPE_UNKNOWN = 0; - private static final int RADIO_TYPE_GSM = 1; - private static final int RADIO_TYPE_WCDMA = 2; - private static final int RADIO_TYPE_CDMA = 3; - private static final int RADIO_TYPE_EVDO = 4; - private static final int RADIO_TYPE_1xRTT = 5; - - /** Simple container for radio data */ - public static final class RadioData { - public int cellId = -1; - public int locationAreaCode = -1; - // TODO: use new SignalStrength instead of asu - public int signalStrength = -1; - public int mobileCountryCode = -1; - public int mobileNetworkCode = -1; - public int homeMobileCountryCode = -1; - public int homeMobileNetworkCode = -1; - public int radioType = RADIO_TYPE_UNKNOWN; - public String carrierName; - - /** - * Constructs radioData object from the given telephony data. - * @param telephonyManager contains the TelephonyManager instance. - * @param cellLocation contains information about the current GSM cell. - * @param signalStrength is the strength of the network signal. - * @param serviceState contains information about the network service. - * @return a new RadioData object populated with the currently - * available network information or null if there isn't - * enough information. - */ - public static RadioData getInstance(TelephonyManager telephonyManager, - CellLocation cellLocation, int signalStrength, - ServiceState serviceState) { - - if (!(cellLocation instanceof GsmCellLocation)) { - // This also covers the case when cellLocation is null. - // When that happens, we do not bother creating a - // RadioData instance. - return null; - } - - RadioData radioData = new RadioData(); - GsmCellLocation gsmCellLocation = (GsmCellLocation) cellLocation; - - // Extract the cell id, LAC, and signal strength. - radioData.cellId = gsmCellLocation.getCid(); - radioData.locationAreaCode = gsmCellLocation.getLac(); - radioData.signalStrength = signalStrength; - - // Extract the home MCC and home MNC. - String operator = telephonyManager.getSimOperator(); - radioData.setMobileCodes(operator, true); - - if (serviceState != null) { - // Extract the carrier name. - radioData.carrierName = serviceState.getOperatorAlphaLong(); - - // Extract the MCC and MNC. - operator = serviceState.getOperatorNumeric(); - radioData.setMobileCodes(operator, false); - } - - // Finally get the radio type. - //TODO We have to edit the parameter for getNetworkType regarding CDMA - int type = telephonyManager.getNetworkType(); - if (type == TelephonyManager.NETWORK_TYPE_UMTS) { - radioData.radioType = RADIO_TYPE_WCDMA; - } else if (type == TelephonyManager.NETWORK_TYPE_GPRS - || type == TelephonyManager.NETWORK_TYPE_EDGE) { - radioData.radioType = RADIO_TYPE_GSM; - } else if (type == TelephonyManager.NETWORK_TYPE_CDMA) { - radioData.radioType = RADIO_TYPE_CDMA; - } else if (type == TelephonyManager.NETWORK_TYPE_EVDO_0) { - radioData.radioType = RADIO_TYPE_EVDO; - } else if (type == TelephonyManager.NETWORK_TYPE_EVDO_A) { - radioData.radioType = RADIO_TYPE_EVDO; - } else if (type == TelephonyManager.NETWORK_TYPE_1xRTT) { - radioData.radioType = RADIO_TYPE_1xRTT; - } - - // Print out what we got. - Log.i(TAG, "Got the following data:"); - Log.i(TAG, "CellId: " + radioData.cellId); - Log.i(TAG, "LAC: " + radioData.locationAreaCode); - Log.i(TAG, "MNC: " + radioData.mobileNetworkCode); - Log.i(TAG, "MCC: " + radioData.mobileCountryCode); - Log.i(TAG, "home MNC: " + radioData.homeMobileNetworkCode); - Log.i(TAG, "home MCC: " + radioData.homeMobileCountryCode); - Log.i(TAG, "Signal strength: " + radioData.signalStrength); - Log.i(TAG, "Carrier: " + radioData.carrierName); - Log.i(TAG, "Network type: " + radioData.radioType); - - return radioData; - } - - private RadioData() {} - - /** - * Parses a string containing a mobile country code and a mobile - * network code and sets the corresponding member variables. - * @param codes is the string to parse. - * @param homeValues flags whether the codes are for the home operator. - */ - private void setMobileCodes(String codes, boolean homeValues) { - if (codes != null) { - try { - // The operator numeric format is 3 digit country code plus 2 or - // 3 digit network code. - int mcc = Integer.parseInt(codes.substring(0, 3)); - int mnc = Integer.parseInt(codes.substring(3)); - if (homeValues) { - homeMobileCountryCode = mcc; - homeMobileNetworkCode = mnc; - } else { - mobileCountryCode = mcc; - mobileNetworkCode = mnc; - } - } catch (IndexOutOfBoundsException ex) { - Log.e( - TAG, - "AndroidRadioDataProvider: Invalid operator numeric data: " + ex); - } catch (NumberFormatException ex) { - Log.e( - TAG, - "AndroidRadioDataProvider: Operator numeric format error: " + ex); - } - } - } - }; - - /** The native object ID */ - private long nativeObject; - - /** The last known cellLocation */ - private CellLocation cellLocation = null; - - /** The last known signal strength */ - // TODO: use new SignalStrength instead of asu - private int signalStrength = -1; - - /** The last known serviceState */ - private ServiceState serviceState = null; - - /** - * Our TelephonyManager instance. - */ - private TelephonyManager telephonyManager; - - /** - * Public constructor. Uses the webview to get the Context object. - */ - public AndroidRadioDataProvider(WebView webview, long object) { - super(); - nativeObject = object; - telephonyManager = (TelephonyManager) webview.getContext().getSystemService( - Context.TELEPHONY_SERVICE); - if (telephonyManager == null) { - Log.e(TAG, - "AndroidRadioDataProvider: could not get tepephony manager."); - throw new NullPointerException( - "AndroidRadioDataProvider: telephonyManager is null."); - } - - // Register for cell id, signal strength and service state changed - // notifications. - telephonyManager.listen(this, PhoneStateListener.LISTEN_CELL_LOCATION - | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS - | PhoneStateListener.LISTEN_SERVICE_STATE); - } - - /** - * Should be called when the provider is no longer needed. - */ - public void shutdown() { - telephonyManager.listen(this, PhoneStateListener.LISTEN_NONE); - Log.i(TAG, "AndroidRadioDataProvider shutdown."); - } - - @Override - public void onServiceStateChanged(ServiceState state) { - serviceState = state; - notifyListeners(); - } - - @Override - public void onSignalStrengthsChanged(SignalStrength ss) { - int gsmSignalStrength = ss.getGsmSignalStrength(); - signalStrength = (gsmSignalStrength == 99 ? -1 : gsmSignalStrength); - notifyListeners(); - } - - @Override - public void onCellLocationChanged(CellLocation location) { - cellLocation = location; - notifyListeners(); - } - - private void notifyListeners() { - RadioData radioData = RadioData.getInstance(telephonyManager, cellLocation, - signalStrength, serviceState); - if (radioData != null) { - onUpdateAvailable(radioData, nativeObject); - } - } - - /** - * The native method called when new radio data is available. - * @param radioData is the RadioData instance to pass to the native side. - * @param nativeObject is a pointer to the corresponding - * AndroidRadioDataProvider C++ instance. - */ - private static native void onUpdateAvailable( - RadioData radioData, long nativeObject); -} diff --git a/core/java/android/webkit/gears/AndroidWifiDataProvider.java b/core/java/android/webkit/gears/AndroidWifiDataProvider.java deleted file mode 100644 index d2850b0..0000000 --- a/core/java/android/webkit/gears/AndroidWifiDataProvider.java +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2008, Google Inc. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// 3. Neither the name of Google Inc. nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package android.webkit.gears; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.net.wifi.ScanResult; -import android.net.wifi.WifiManager; -import android.os.Handler; -import android.os.Looper; -import android.util.Log; -import android.webkit.WebView; -import java.util.List; - -/** - * WiFi data provider implementation for Android. - * {@hide} - */ -public final class AndroidWifiDataProvider extends BroadcastReceiver { - /** - * Logging tag - */ - private static final String TAG = "Gears-J-WifiProvider"; - /** - * Flag for guarding Log.v() calls. - * Set to true to enable extra debug logging. - */ - private static final boolean LOGV_ENABLED = false; - /** - * Our Wifi manager instance. - */ - private WifiManager mWifiManager; - /** - * The native object ID. - */ - private long mNativeObject; - /** - * The Context instance. - */ - private Context mContext; - - /** - * Constructs a instance of this class and registers for wifi scan - * updates. Note that this constructor must be called on a Looper - * thread. Suitable threads can be created on the native side using - * the AndroidLooperThread C++ class. - */ - public AndroidWifiDataProvider(WebView webview, long object) { - mNativeObject = object; - mContext = webview.getContext(); - mWifiManager = - (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); - if (mWifiManager == null) { - Log.e(TAG, - "AndroidWifiDataProvider: could not get location manager."); - throw new NullPointerException( - "AndroidWifiDataProvider: locationManager is null."); - } - - // Create a Handler that identifies the message loop associated - // with the current thread. Note that it is not necessary to - // override handleMessage() at all since the Intent - // ReceiverDispatcher (see the ActivityThread class) only uses - // this handler to post a Runnable to this thread's loop. - Handler handler = new Handler(Looper.myLooper()); - - IntentFilter filter = new IntentFilter(); - filter.addAction(mWifiManager.SCAN_RESULTS_AVAILABLE_ACTION); - mContext.registerReceiver(this, filter, null, handler); - - // Get the last scan results and pass them to the native side. - // We can't just invoke the callback here, so we queue a message - // to this thread's loop. - handler.post(new Runnable() { - public void run() { - onUpdateAvailable(mWifiManager.getScanResults(), mNativeObject); - } - }); - } - - /** - * Called when the provider is no longer needed. - */ - public void shutdown() { - mContext.unregisterReceiver(this); - if (LOGV_ENABLED) { - Log.v(TAG, "Wifi provider closed."); - } - } - - /** - * This method is called when the AndroidWifiDataProvider is receiving an - * Intent broadcast. - * @param context The Context in which the receiver is running. - * @param intent The Intent being received. - */ - public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals( - mWifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { - if (LOGV_ENABLED) { - Log.v(TAG, "Wifi scan resulst available"); - } - onUpdateAvailable(mWifiManager.getScanResults(), mNativeObject); - } - } - - /** - * The native method called when new wifi data is available. - * @param scanResults is a list of ScanResults to pass to the native side. - * @param nativeObject is a pointer to the corresponding - * AndroidWifiDataProvider C++ instance. - */ - private static native void onUpdateAvailable( - List<ScanResult> scanResults, long nativeObject); -} diff --git a/core/java/android/webkit/gears/ApacheHttpRequestAndroid.java b/core/java/android/webkit/gears/ApacheHttpRequestAndroid.java deleted file mode 100644 index b3d7f69..0000000 --- a/core/java/android/webkit/gears/ApacheHttpRequestAndroid.java +++ /dev/null @@ -1,1129 +0,0 @@ -// Copyright 2008, The Android Open Source Project -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// 3. Neither the name of Google Inc. nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package android.webkit.gears; - -import android.net.http.Headers; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.util.Log; -import android.webkit.CacheManager; -import android.webkit.CacheManager.CacheResult; -import android.webkit.CookieManager; - -import java.io.InputStream; -import java.io.OutputStream; -import java.io.IOException; -import java.lang.StringBuilder; -import java.util.Map; -import java.util.HashMap; -import java.util.Iterator; - -import org.apache.http.Header; -import org.apache.http.HttpEntity; -import org.apache.http.client.params.HttpClientParams; -import org.apache.http.params.HttpParams; -import org.apache.http.params.HttpConnectionParams; -import org.apache.http.params.HttpProtocolParams; -import org.apache.http.HttpResponse; -import org.apache.http.entity.AbstractHttpEntity; -import org.apache.http.client.*; -import org.apache.http.client.methods.*; -import org.apache.http.impl.client.AbstractHttpClient; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; -import org.apache.http.conn.ssl.StrictHostnameVerifier; -import org.apache.http.util.CharArrayBuffer; - -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -/** - * Performs the underlying HTTP/HTTPS GET, POST, HEAD, PUT, DELETE requests. - * <p> These are performed synchronously (blocking). The caller should - * ensure that it is in a background thread if asynchronous behavior - * is required. All data is pushed, so there is no need for JNI native - * callbacks. - * <p> This uses Apache's HttpClient framework to perform most - * of the underlying network activity. The Android brower's cache, - * android.webkit.CacheManager, is also used when caching is enabled, - * and updated with new data. The android.webkit.CookieManager is also - * queried and updated as necessary. - * <p> The public interface is designed to be called by native code - * through JNI, and to simplify coding none of the public methods will - * surface a checked exception. Unchecked exceptions may still be - * raised but only if the system is in an ill state, such as out of - * memory. - * <p> TODO: This isn't plumbed into LocalServer yet. Mutually - * dependent on LocalServer - will attach the two together once both - * are submitted. - */ -public final class ApacheHttpRequestAndroid { - /** Debug logging tag. */ - private static final String LOG_TAG = "Gears-J"; - /** Flag for guarding Log.v() calls. */ - private static final boolean LOGV_ENABLED = false; - /** HTTP response header line endings are CR-LF style. */ - private static final String HTTP_LINE_ENDING = "\r\n"; - /** Safe MIME type to use whenever it isn't specified. */ - private static final String DEFAULT_MIME_TYPE = "text/plain"; - /** Case-sensitive header keys */ - public static final String KEY_CONTENT_LENGTH = "Content-Length"; - public static final String KEY_EXPIRES = "Expires"; - public static final String KEY_LAST_MODIFIED = "Last-Modified"; - public static final String KEY_ETAG = "ETag"; - public static final String KEY_LOCATION = "Location"; - public static final String KEY_CONTENT_TYPE = "Content-Type"; - /** Number of bytes to send and receive on the HTTP connection in - * one go. */ - private static final int BUFFER_SIZE = 4096; - - /** The first element of the String[] value in a headers map is the - * unmodified (case-sensitive) key. */ - public static final int HEADERS_MAP_INDEX_KEY = 0; - /** The second element of the String[] value in a headers map is the - * associated value. */ - public static final int HEADERS_MAP_INDEX_VALUE = 1; - - /** Request headers, as key -> value map. */ - // TODO: replace this design by a simpler one (the C++ side has to - // be modified too), where we do not store both the original header - // and the lowercase one. - private Map<String, String[]> mRequestHeaders = - new HashMap<String, String[]>(); - /** Response headers, as a lowercase key -> value map. */ - private Map<String, String[]> mResponseHeaders = - new HashMap<String, String[]>(); - /** The URL used for createCacheResult() */ - private String mCacheResultUrl; - /** CacheResult being saved into, if inserting a new cache entry. */ - private CacheResult mCacheResult; - /** Initialized by initChildThread(). Used to target abort(). */ - private Thread mBridgeThread; - - /** Our HttpClient */ - private AbstractHttpClient mClient; - /** The HttpMethod associated with this request */ - private HttpRequestBase mMethod; - /** The complete response line e.g "HTTP/1.0 200 OK" */ - private String mResponseLine; - /** HTTP body stream, setup after connection. */ - private InputStream mBodyInputStream; - - /** HTTP Response Entity */ - private HttpResponse mResponse; - - /** Post Entity, used to stream the request to the server */ - private StreamEntity mPostEntity = null; - /** Content lenght, mandatory when using POST */ - private long mContentLength; - - /** The request executes in a parallel thread */ - private Thread mHttpThread = null; - /** protect mHttpThread, if interrupt() is called concurrently */ - private Lock mHttpThreadLock = new ReentrantLock(); - /** Flag set to true when the request thread is joined */ - private boolean mConnectionFinished = false; - /** Flag set to true by interrupt() and/or connection errors */ - private boolean mConnectionFailed = false; - /** Lock protecting the access to mConnectionFailed */ - private Lock mConnectionFailedLock = new ReentrantLock(); - - /** Lock on the loop in StreamEntity */ - private Lock mStreamingReadyLock = new ReentrantLock(); - /** Condition variable used to signal the loop is ready... */ - private Condition mStreamingReady = mStreamingReadyLock.newCondition(); - - /** Used to pass around the block of data POSTed */ - private Buffer mBuffer = new Buffer(); - /** Used to signal that the block of data has been written */ - private SignalConsumed mSignal = new SignalConsumed(); - - // inner classes - - /** - * Implements the http request - */ - class Connection implements Runnable { - public void run() { - boolean problem = false; - try { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "REQUEST : " + mMethod.getRequestLine()); - } - mResponse = mClient.execute(mMethod); - if (mResponse != null) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "response (status line): " - + mResponse.getStatusLine()); - } - mResponseLine = "" + mResponse.getStatusLine(); - } else { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "problem, response == null"); - } - problem = true; - } - } catch (IOException e) { - Log.e(LOG_TAG, "Connection IO exception ", e); - problem = true; - } catch (RuntimeException e) { - Log.e(LOG_TAG, "Connection runtime exception ", e); - problem = true; - } - - if (!problem) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "Request complete (" - + mMethod.getRequestLine() + ")"); - } - } else { - mConnectionFailedLock.lock(); - mConnectionFailed = true; - mConnectionFailedLock.unlock(); - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "Request FAILED (" - + mMethod.getRequestLine() + ")"); - } - // We abort the execution in order to shutdown and release - // the underlying connection - mMethod.abort(); - if (mPostEntity != null) { - // If there is a post entity, we need to wake it up from - // a potential deadlock - mPostEntity.signalOutputStream(); - } - } - } - } - - /** - * simple buffer class implementing a producer/consumer model - */ - class Buffer { - private DataPacket mPacket; - private boolean mEmpty = true; - public synchronized void put(DataPacket packet) { - while (!mEmpty) { - try { - wait(); - } catch (InterruptedException e) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "InterruptedException while putting " + - "a DataPacket in the Buffer: " + e); - } - } - } - mPacket = packet; - mEmpty = false; - notify(); - } - public synchronized DataPacket get() { - while (mEmpty) { - try { - wait(); - } catch (InterruptedException e) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "InterruptedException while getting " + - "a DataPacket in the Buffer: " + e); - } - } - } - mEmpty = true; - notify(); - return mPacket; - } - } - - /** - * utility class used to block until the packet is signaled as being - * consumed - */ - class SignalConsumed { - private boolean mConsumed = false; - public synchronized void waitUntilPacketConsumed() { - while (!mConsumed) { - try { - wait(); - } catch (InterruptedException e) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "InterruptedException while waiting " + - "until a DataPacket is consumed: " + e); - } - } - } - mConsumed = false; - notify(); - } - public synchronized void packetConsumed() { - while (mConsumed) { - try { - wait(); - } catch (InterruptedException e) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "InterruptedException while indicating " - + "that the DataPacket has been consumed: " + e); - } - } - } - mConsumed = true; - notify(); - } - } - - /** - * Utility class encapsulating a packet of data - */ - class DataPacket { - private byte[] mContent; - private int mLength; - public DataPacket(byte[] content, int length) { - mContent = content; - mLength = length; - } - public byte[] getBytes() { - return mContent; - } - public int getLength() { - return mLength; - } - } - - /** - * HttpEntity class to write the bytes received by the C++ thread - * on the connection outputstream, in a streaming way. - * This entity is executed in the request thread. - * The writeTo() method is automatically called by the - * HttpPost execution; upon reception, we loop while receiving - * the data packets from the main thread, until completion - * or error. When done, we flush the outputstream. - * The main thread (sendPostData()) also blocks until the - * outputstream is made available (or an error happens) - */ - class StreamEntity implements HttpEntity { - private OutputStream mOutputStream; - - // HttpEntity interface methods - - public boolean isRepeatable() { - return false; - } - - public boolean isChunked() { - return false; - } - - public long getContentLength() { - return mContentLength; - } - - public Header getContentType() { - return null; - } - - public Header getContentEncoding() { - return null; - } - - public InputStream getContent() throws IOException { - return null; - } - - public void writeTo(final OutputStream out) throws IOException { - // We signal that the outputstream is available - mStreamingReadyLock.lock(); - mOutputStream = out; - mStreamingReady.signal(); - mStreamingReadyLock.unlock(); - - // We then loop waiting on messages to process. - boolean finished = false; - while (!finished) { - DataPacket packet = mBuffer.get(); - if (packet == null) { - finished = true; - } else { - write(packet); - } - mSignal.packetConsumed(); - mConnectionFailedLock.lock(); - if (mConnectionFailed) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "stopping loop on error"); - } - finished = true; - } - mConnectionFailedLock.unlock(); - } - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "flushing the outputstream..."); - } - mOutputStream.flush(); - } - - public boolean isStreaming() { - return true; - } - - public void consumeContent() throws IOException { - // Nothing to release - } - - // local methods - - private void write(DataPacket packet) { - try { - if (mOutputStream == null) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "NO OUTPUT STREAM !!!"); - } - return; - } - mOutputStream.write(packet.getBytes(), 0, packet.getLength()); - mOutputStream.flush(); - } catch (IOException e) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "exc: " + e); - } - mConnectionFailedLock.lock(); - mConnectionFailed = true; - mConnectionFailedLock.unlock(); - } - } - - public boolean isReady() { - mStreamingReadyLock.lock(); - try { - if (mOutputStream == null) { - mStreamingReady.await(); - } - } catch (InterruptedException e) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "InterruptedException in " - + "StreamEntity::isReady() : ", e); - } - } finally { - mStreamingReadyLock.unlock(); - } - if (mOutputStream == null) { - return false; - } - return true; - } - - public void signalOutputStream() { - mStreamingReadyLock.lock(); - mStreamingReady.signal(); - mStreamingReadyLock.unlock(); - } - } - - /** - * Initialize mBridgeThread using the TLS value of - * Thread.currentThread(). Called on start up of the native child - * thread. - */ - public synchronized void initChildThread() { - mBridgeThread = Thread.currentThread(); - } - - public void setContentLength(long length) { - mContentLength = length; - } - - /** - * Analagous to the native-side HttpRequest::open() function. This - * initializes an underlying HttpClient method, but does - * not go to the wire. On success, this enables a call to send() to - * initiate the transaction. - * - * @param method The HTTP method, e.g GET or POST. - * @param url The URL to open. - * @return True on success with a complete HTTP response. - * False on failure. - */ - public synchronized boolean open(String method, String url) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "open " + method + " " + url); - } - // Create the client - if (mConnectionFailed) { - // interrupt() could have been called even before open() - return false; - } - mClient = new DefaultHttpClient(); - mClient.setHttpRequestRetryHandler( - new DefaultHttpRequestRetryHandler(0, false)); - mBodyInputStream = null; - mResponseLine = null; - mResponseHeaders = null; - mPostEntity = null; - mHttpThread = null; - mConnectionFailed = false; - mConnectionFinished = false; - - // Create the method. We support everything that - // Apache HttpClient supports, apart from TRACE. - if ("GET".equalsIgnoreCase(method)) { - mMethod = new HttpGet(url); - } else if ("POST".equalsIgnoreCase(method)) { - mMethod = new HttpPost(url); - mPostEntity = new StreamEntity(); - ((HttpPost)mMethod).setEntity(mPostEntity); - } else if ("HEAD".equalsIgnoreCase(method)) { - mMethod = new HttpHead(url); - } else if ("PUT".equalsIgnoreCase(method)) { - mMethod = new HttpPut(url); - } else if ("DELETE".equalsIgnoreCase(method)) { - mMethod = new HttpDelete(url); - } else { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "Method " + method + " not supported"); - } - return false; - } - HttpParams params = mClient.getParams(); - // We handle the redirections C++-side - HttpClientParams.setRedirecting(params, false); - HttpProtocolParams.setUseExpectContinue(params, false); - return true; - } - - /** - * We use this to start the connection thread (doing the method execute). - * We usually always return true here, as the connection will run its - * course in the thread. - * We only return false if interrupted beforehand -- if a connection - * problem happens, we will thus fail in either sendPostData() or - * parseHeaders(). - */ - public synchronized boolean connectToRemote() { - boolean ret = false; - applyRequestHeaders(); - mConnectionFailedLock.lock(); - if (!mConnectionFailed) { - mHttpThread = new Thread(new Connection()); - mHttpThread.start(); - } - ret = mConnectionFailed; - mConnectionFailedLock.unlock(); - return !ret; - } - - /** - * Get the complete response line of the HTTP request. Only valid on - * completion of the transaction. - * @return The complete HTTP response line, e.g "HTTP/1.0 200 OK". - */ - public synchronized String getResponseLine() { - return mResponseLine; - } - - /** - * Wait for the request thread completion - * (unless already finished) - */ - private void waitUntilConnectionFinished() { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "waitUntilConnectionFinished(" - + mConnectionFinished + ")"); - } - if (!mConnectionFinished) { - if (mHttpThread != null) { - try { - mHttpThread.join(); - mConnectionFinished = true; - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "http thread joined"); - } - } catch (InterruptedException e) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "interrupted: " + e); - } - } - } else { - Log.e(LOG_TAG, ">>> Trying to join on mHttpThread " + - "when it does not exist!"); - } - } - } - - // Headers handling - - /** - * Receive all headers from the server and populate - * mResponseHeaders. - * @return True if headers are successfully received, False on - * connection error. - */ - public synchronized boolean parseHeaders() { - mConnectionFailedLock.lock(); - if (mConnectionFailed) { - mConnectionFailedLock.unlock(); - return false; - } - mConnectionFailedLock.unlock(); - waitUntilConnectionFinished(); - mResponseHeaders = new HashMap<String, String[]>(); - if (mResponse == null) - return false; - - Header[] headers = mResponse.getAllHeaders(); - for (int i = 0; i < headers.length; i++) { - Header header = headers[i]; - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "header " + header.getName() - + " -> " + header.getValue()); - } - setResponseHeader(header.getName(), header.getValue()); - } - - return true; - } - - /** - * Set a header to send with the HTTP request. Will not take effect - * on a transaction already in progress. The key is associated - * case-insensitive, but stored case-sensitive. - * @param name The name of the header, e.g "Set-Cookie". - * @param value The value for this header, e.g "text/html". - */ - public synchronized void setRequestHeader(String name, String value) { - String[] mapValue = { name, value }; - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "setRequestHeader: " + name + " => " + value); - } - if (name.equalsIgnoreCase(KEY_CONTENT_LENGTH)) { - setContentLength(Long.parseLong(value)); - } else { - mRequestHeaders.put(name.toLowerCase(), mapValue); - } - } - - /** - * Returns the value associated with the given request header. - * @param name The name of the request header, non-null, case-insensitive. - * @return The value associated with the request header, or null if - * not set, or error. - */ - public synchronized String getRequestHeader(String name) { - String[] value = mRequestHeaders.get(name.toLowerCase()); - if (value != null) { - return value[HEADERS_MAP_INDEX_VALUE]; - } else { - return null; - } - } - - private void applyRequestHeaders() { - if (mMethod == null) - return; - Iterator<String[]> it = mRequestHeaders.values().iterator(); - while (it.hasNext()) { - // Set the key case-sensitive. - String[] entry = it.next(); - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "apply header " + entry[HEADERS_MAP_INDEX_KEY] + - " => " + entry[HEADERS_MAP_INDEX_VALUE]); - } - mMethod.setHeader(entry[HEADERS_MAP_INDEX_KEY], - entry[HEADERS_MAP_INDEX_VALUE]); - } - } - - /** - * Returns the value associated with the given response header. - * @param name The name of the response header, non-null, case-insensitive. - * @return The value associated with the response header, or null if - * not set or error. - */ - public synchronized String getResponseHeader(String name) { - if (mResponseHeaders != null) { - String[] value = mResponseHeaders.get(name.toLowerCase()); - if (value != null) { - return value[HEADERS_MAP_INDEX_VALUE]; - } else { - return null; - } - } else { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "getResponseHeader() called but " - + "response not received"); - } - return null; - } - } - - /** - * Return all response headers, separated by CR-LF line endings, and - * ending with a trailing blank line. This mimics the format of the - * raw response header up to but not including the body. - * @return A string containing the entire response header. - */ - public synchronized String getAllResponseHeaders() { - if (mResponseHeaders == null) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "getAllResponseHeaders() called but " - + "response not received"); - } - return null; - } - StringBuilder result = new StringBuilder(); - Iterator<String[]> it = mResponseHeaders.values().iterator(); - while (it.hasNext()) { - String[] entry = it.next(); - // Output the "key: value" lines. - result.append(entry[HEADERS_MAP_INDEX_KEY]); - result.append(": "); - result.append(entry[HEADERS_MAP_INDEX_VALUE]); - result.append(HTTP_LINE_ENDING); - } - result.append(HTTP_LINE_ENDING); - return result.toString(); - } - - - /** - * Set a response header and associated value. The key is associated - * case-insensitively, but stored case-sensitively. - * @param name Case sensitive request header key. - * @param value The associated value. - */ - private void setResponseHeader(String name, String value) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "Set response header " + name + ": " + value); - } - String mapValue[] = { name, value }; - mResponseHeaders.put(name.toLowerCase(), mapValue); - } - - // Cookie handling - - /** - * Get the cookie for the given URL. - * @param url The fully qualified URL. - * @return A string containing the cookie for the URL if it exists, - * or null if not. - */ - public static String getCookieForUrl(String url) { - // Get the cookie for this URL, set as a header - return CookieManager.getInstance().getCookie(url); - } - - /** - * Set the cookie for the given URL. - * @param url The fully qualified URL. - * @param cookie The new cookie value. - * @return A string containing the cookie for the URL if it exists, - * or null if not. - */ - public static void setCookieForUrl(String url, String cookie) { - // Get the cookie for this URL, set as a header - CookieManager.getInstance().setCookie(url, cookie); - } - - // Cache handling - - /** - * Perform a request using LocalServer if possible. Initializes - * class members so that receive() will obtain data from the stream - * provided by the response. - * @param url The fully qualified URL to try in LocalServer. - * @return True if the url was found and is now setup to receive. - * False if not found, with no side-effect. - */ - public synchronized boolean useLocalServerResult(String url) { - UrlInterceptHandlerGears handler = - UrlInterceptHandlerGears.getInstance(); - if (handler == null) { - return false; - } - UrlInterceptHandlerGears.ServiceResponse serviceResponse = - handler.getServiceResponse(url, mRequestHeaders); - if (serviceResponse == null) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "No response in LocalServer"); - } - return false; - } - // LocalServer will handle this URL. Initialize stream and - // response. - mBodyInputStream = serviceResponse.getInputStream(); - mResponseLine = serviceResponse.getStatusLine(); - mResponseHeaders = serviceResponse.getResponseHeaders(); - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "Got response from LocalServer: " + mResponseLine); - } - return true; - } - - /** - * Perform a request using the cache result if present. Initializes - * class members so that receive() will obtain data from the cache. - * @param url The fully qualified URL to try in the cache. - * @return True is the url was found and is now setup to receive - * from cache. False if not found, with no side-effect. - */ - public synchronized boolean useCacheResult(String url) { - // Try the browser's cache. CacheManager wants a Map<String, String>. - Map<String, String> cacheRequestHeaders = new HashMap<String, String>(); - Iterator<Map.Entry<String, String[]>> it = - mRequestHeaders.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry<String, String[]> entry = it.next(); - cacheRequestHeaders.put( - entry.getKey(), - entry.getValue()[HEADERS_MAP_INDEX_VALUE]); - } - CacheResult mCacheResult = - CacheManager.getCacheFile(url, cacheRequestHeaders); - if (mCacheResult == null) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "No CacheResult for " + url); - } - return false; - } - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "Got CacheResult from browser cache"); - } - // Check for expiry. -1 is "never", otherwise milliseconds since 1970. - // Can be compared to System.currentTimeMillis(). - long expires = mCacheResult.getExpires(); - if (expires >= 0 && System.currentTimeMillis() >= expires) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "CacheResult expired " - + (System.currentTimeMillis() - expires) - + " milliseconds ago"); - } - // Cache hit has expired. Do not return it. - return false; - } - // Setup the mBodyInputStream to come from the cache. - mBodyInputStream = mCacheResult.getInputStream(); - if (mBodyInputStream == null) { - // Cache result may have gone away. - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "No mBodyInputStream for CacheResult " + url); - } - return false; - } - // Cache hit. Parse headers. - synthesizeHeadersFromCacheResult(mCacheResult); - return true; - } - - /** - * Take the limited set of headers in a CacheResult and synthesize - * response headers. - * @param cacheResult A CacheResult to populate mResponseHeaders with. - */ - private void synthesizeHeadersFromCacheResult(CacheResult cacheResult) { - int statusCode = cacheResult.getHttpStatusCode(); - // The status message is informal, so we can greatly simplify it. - String statusMessage; - if (statusCode >= 200 && statusCode < 300) { - statusMessage = "OK"; - } else if (statusCode >= 300 && statusCode < 400) { - statusMessage = "MOVED"; - } else { - statusMessage = "UNAVAILABLE"; - } - // Synthesize the response line. - mResponseLine = "HTTP/1.1 " + statusCode + " " + statusMessage; - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "Synthesized " + mResponseLine); - } - // Synthesize the returned headers from cache. - mResponseHeaders = new HashMap<String, String[]>(); - String contentLength = Long.toString(cacheResult.getContentLength()); - setResponseHeader(KEY_CONTENT_LENGTH, contentLength); - String expires = cacheResult.getExpiresString(); - if (expires != null) { - setResponseHeader(KEY_EXPIRES, expires); - } - String lastModified = cacheResult.getLastModified(); - if (lastModified != null) { - // Last modification time of the page. Passed end-to-end, but - // not used by us. - setResponseHeader(KEY_LAST_MODIFIED, lastModified); - } - String eTag = cacheResult.getETag(); - if (eTag != null) { - // Entity tag. A kind of GUID to identify identical resources. - setResponseHeader(KEY_ETAG, eTag); - } - String location = cacheResult.getLocation(); - if (location != null) { - // If valid, refers to the location of a redirect. - setResponseHeader(KEY_LOCATION, location); - } - String mimeType = cacheResult.getMimeType(); - if (mimeType == null) { - // Use a safe default MIME type when none is - // specified. "text/plain" is safe to render in the browser - // window (even if large) and won't be intepreted as anything - // that would cause execution. - mimeType = DEFAULT_MIME_TYPE; - } - String encoding = cacheResult.getEncoding(); - // Encoding may not be specified. No default. - String contentType = mimeType; - if (encoding != null) { - if (encoding.length() > 0) { - contentType += "; charset=" + encoding; - } - } - setResponseHeader(KEY_CONTENT_TYPE, contentType); - } - - /** - * Create a CacheResult for this URL. This enables the repsonse body - * to be sent in calls to appendCacheResult(). - * @param url The fully qualified URL to add to the cache. - * @param responseCode The response code returned for the request, e.g 200. - * @param mimeType The MIME type of the body, e.g "text/plain". - * @param encoding The encoding, e.g "utf-8". Use "" for unknown. - */ - public synchronized boolean createCacheResult( - String url, int responseCode, String mimeType, String encoding) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "Making cache entry for " + url); - } - // Take the headers and parse them into a format needed by - // CacheManager. - Headers cacheHeaders = new Headers(); - Iterator<Map.Entry<String, String[]>> it = - mResponseHeaders.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry<String, String[]> entry = it.next(); - // Headers.parseHeader() expects lowercase keys. - String keyValue = entry.getKey() + ": " - + entry.getValue()[HEADERS_MAP_INDEX_VALUE]; - CharArrayBuffer buffer = new CharArrayBuffer(keyValue.length()); - buffer.append(keyValue); - // Parse it into the header container. - cacheHeaders.parseHeader(buffer); - } - mCacheResult = CacheManager.createCacheFile( - url, responseCode, cacheHeaders, mimeType, true); - if (mCacheResult != null) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "Saving into cache"); - } - mCacheResult.setEncoding(encoding); - mCacheResultUrl = url; - return true; - } else { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "Couldn't create mCacheResult"); - } - return false; - } - } - - /** - * Add data from the response body to the CacheResult created with - * createCacheResult(). - * @param data A byte array of the next sequential bytes in the - * response body. - * @param bytes The number of bytes to write from the start of - * the array. - * @return True if all bytes successfully written, false on failure. - */ - public synchronized boolean appendCacheResult(byte[] data, int bytes) { - if (mCacheResult == null) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "appendCacheResult() called without a " - + "CacheResult initialized"); - } - return false; - } - try { - mCacheResult.getOutputStream().write(data, 0, bytes); - } catch (IOException ex) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "Got IOException writing cache data: " + ex); - } - return false; - } - return true; - } - - /** - * Save the completed CacheResult into the CacheManager. This must - * have been created first with createCacheResult(). - * @return Returns true if the entry has been successfully saved. - */ - public synchronized boolean saveCacheResult() { - if (mCacheResult == null || mCacheResultUrl == null) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "Tried to save cache result but " - + "createCacheResult not called"); - } - return false; - } - - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "Saving cache result"); - } - CacheManager.saveCacheFile(mCacheResultUrl, mCacheResult); - mCacheResult = null; - mCacheResultUrl = null; - return true; - } - - /** - * Called by the main thread to interrupt the child thread. - * We do not set mConnectionFailed here as we still need the - * ability to receive a null packet for sendPostData(). - */ - public synchronized void abort() { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "ABORT CALLED"); - } - if (mMethod != null) { - mMethod.abort(); - } - } - - /** - * Interrupt a blocking IO operation and wait for the - * thread to complete. - */ - public synchronized void interrupt() { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "INTERRUPT CALLED"); - } - mConnectionFailedLock.lock(); - mConnectionFailed = true; - mConnectionFailedLock.unlock(); - if (mMethod != null) { - mMethod.abort(); - } - if (mHttpThread != null) { - waitUntilConnectionFinished(); - } - } - - /** - * Receive the next sequential bytes of the response body after - * successful connection. This will receive up to the size of the - * provided byte array. If there is no body, this will return 0 - * bytes on the first call after connection. - * @param buf A pre-allocated byte array to receive data into. - * @return The number of bytes from the start of the array which - * have been filled, 0 on EOF, or negative on error. - */ - public synchronized int receive(byte[] buf) { - if (mBodyInputStream == null) { - // If this is the first call, setup the InputStream. This may - // fail if there were headers, but no body returned by the - // server. - try { - if (mResponse != null) { - HttpEntity entity = mResponse.getEntity(); - mBodyInputStream = entity.getContent(); - } - } catch (IOException inputException) { - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "Failed to connect InputStream: " - + inputException); - } - // Not unexpected. For example, 404 response return headers, - // and sometimes a body with a detailed error. - } - if (mBodyInputStream == null) { - // No error stream either. Treat as a 0 byte response. - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "No InputStream"); - } - return 0; // EOF. - } - } - int ret; - try { - int got = mBodyInputStream.read(buf); - if (got > 0) { - // Got some bytes, not EOF. - ret = got; - } else { - // EOF. - mBodyInputStream.close(); - ret = 0; - } - } catch (IOException e) { - // An abort() interrupts us by calling close() on our stream. - if (LOGV_ENABLED) { - Log.i(LOG_TAG, "Got IOException in mBodyInputStream.read(): ", e); - } - ret = -1; - } - return ret; - } - - /** - * For POST method requests, send a stream of data provided by the - * native side in repeated callbacks. - * We put the data in mBuffer, and wait until it is consumed - * by the StreamEntity in the request thread. - * @param data A byte array containing the data to sent, or null - * if indicating EOF. - * @param bytes The number of bytes from the start of the array to - * send, or 0 if indicating EOF. - * @return True if all bytes were successfully sent, false on error. - */ - public boolean sendPostData(byte[] data, int bytes) { - mConnectionFailedLock.lock(); - if (mConnectionFailed) { - mConnectionFailedLock.unlock(); - return false; - } - mConnectionFailedLock.unlock(); - if (mPostEntity == null) return false; - - // We block until the outputstream is available - // (or in case of connection error) - if (!mPostEntity.isReady()) return false; - - if (data == null && bytes == 0) { - mBuffer.put(null); - } else { - mBuffer.put(new DataPacket(data, bytes)); - } - mSignal.waitUntilPacketConsumed(); - - mConnectionFailedLock.lock(); - if (mConnectionFailed) { - Log.e(LOG_TAG, "failure"); - mConnectionFailedLock.unlock(); - return false; - } - mConnectionFailedLock.unlock(); - return true; - } - -} diff --git a/core/java/android/webkit/gears/DesktopAndroid.java b/core/java/android/webkit/gears/DesktopAndroid.java deleted file mode 100644 index a7a144b..0000000 --- a/core/java/android/webkit/gears/DesktopAndroid.java +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2008 The Android Open Source Project -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// 3. Neither the name of Google Inc. nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package android.webkit.gears; - -import android.content.Context; -import android.content.ComponentName; -import android.content.Intent; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.net.Uri; -import android.provider.Browser; -import android.util.Log; -import android.webkit.WebView; - -/** - * Utility class to create a shortcut on Android - */ -public class DesktopAndroid { - - private static final String TAG = "Gears-J-Desktop"; - private static final String EXTRA_SHORTCUT_DUPLICATE = "duplicate"; - private static final String ACTION_INSTALL_SHORTCUT = - "com.android.launcher.action.INSTALL_SHORTCUT"; - - // Android now enforces a 64x64 limit for the icon - private static int MAX_WIDTH = 64; - private static int MAX_HEIGHT = 64; - - /** - * Small utility function returning a Bitmap object. - * - * @param path the icon path - */ - private static Bitmap getBitmap(String path) { - return BitmapFactory.decodeFile(path); - } - - /** - * Create a shortcut for a webpage. - * - * <p>To set a shortcut on Android, we use the ACTION_INSTALL_SHORTCUT - * from the default Home application. We only have to create an Intent - * containing extra parameters specifying the shortcut. - * <p>Note: the shortcut mechanism is not system wide and depends on the - * Home application; if phone carriers decide to rewrite a Home application - * that does not accept this Intent, no shortcut will be added. - * - * @param webview the webview we are called from - * @param title the shortcut's title - * @param url the shortcut's url - * @param imagePath the local path of the shortcut's icon - */ - public static void setShortcut(WebView webview, String title, - String url, String imagePath) { - Context context = webview.getContext(); - - Intent viewWebPage = new Intent(Intent.ACTION_VIEW); - viewWebPage.setData(Uri.parse(url)); - long urlHash = url.hashCode(); - long uniqueId = (urlHash << 32) | viewWebPage.hashCode(); - viewWebPage.putExtra(Browser.EXTRA_APPLICATION_ID, - Long.toString(uniqueId)); - - Intent intent = new Intent(ACTION_INSTALL_SHORTCUT); - intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, viewWebPage); - intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, title); - - // We disallow the creation of duplicate shortcuts (i.e. same - // url, same title, but different screen position). - intent.putExtra(EXTRA_SHORTCUT_DUPLICATE, false); - - Bitmap bmp = getBitmap(imagePath); - if (bmp != null) { - if ((bmp.getWidth() > MAX_WIDTH) || - (bmp.getHeight() > MAX_HEIGHT)) { - Bitmap scaledBitmap = Bitmap.createScaledBitmap(bmp, - MAX_WIDTH, MAX_HEIGHT, true); - intent.putExtra(Intent.EXTRA_SHORTCUT_ICON, scaledBitmap); - } else { - intent.putExtra(Intent.EXTRA_SHORTCUT_ICON, bmp); - } - } else { - // This should not happen as we just downloaded the icon - Log.e(TAG, "icon file <" + imagePath + "> not found"); - } - - context.sendBroadcast(intent); - } - -} diff --git a/core/java/android/webkit/gears/NativeDialog.java b/core/java/android/webkit/gears/NativeDialog.java deleted file mode 100644 index 9e2b375..0000000 --- a/core/java/android/webkit/gears/NativeDialog.java +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright 2008 The Android Open Source Project -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// 3. Neither the name of Google Inc. nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package android.webkit.gears; - -import android.content.ActivityNotFoundException; -import android.content.Context; -import android.content.Intent; -import android.util.Log; - -import java.io.File; -import java.lang.InterruptedException; -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -/** - * Utility class to call a modal native dialog on Android - * The dialog itself is an Activity defined in the Browser. - * @hide - */ -public class NativeDialog { - - private static final String TAG = "Gears-J-NativeDialog"; - - private final String DIALOG_PACKAGE = "com.android.browser"; - private final String DIALOG_CLASS = DIALOG_PACKAGE + ".GearsNativeDialog"; - - private static Lock mLock = new ReentrantLock(); - private static Condition mDialogFinished = mLock.newCondition(); - private static String mResults = null; - - private static boolean mAsynchronousDialog; - - /** - * Utility function to build the intent calling the - * dialog activity - */ - private Intent createIntent(String type, String arguments) { - Intent intent = new Intent(); - intent.setClassName(DIALOG_PACKAGE, DIALOG_CLASS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.putExtra("dialogArguments", arguments); - intent.putExtra("dialogType", type); - return intent; - } - - /** - * Opens a native dialog synchronously and waits for its completion. - * - * The dialog is an activity (GearsNativeDialog) provided by the Browser - * that we call via startActivity(). Contrary to a normal activity though, - * we need to block until it returns. To do so, we define a static lock - * object in this class, which GearsNativeDialog can unlock once done - */ - public String showDialog(Context context, String file, - String arguments) { - - try { - mAsynchronousDialog = false; - mLock.lock(); - File path = new File(file); - String fileName = path.getName(); - String type = fileName.substring(0, fileName.indexOf(".html")); - Intent intent = createIntent(type, arguments); - - mResults = null; - context.startActivity(intent); - mDialogFinished.await(); - } catch (InterruptedException e) { - Log.e(TAG, "exception e: " + e); - } catch (ActivityNotFoundException e) { - Log.e(TAG, "exception e: " + e); - } finally { - mLock.unlock(); - } - - return mResults; - } - - /** - * Opens a native dialog asynchronously - * - * The dialog is an activity (GearsNativeDialog) provided by the - * Browser. - */ - public void showAsyncDialog(Context context, String type, - String arguments) { - mAsynchronousDialog = true; - Intent intent = createIntent(type, arguments); - context.startActivity(intent); - } - - /** - * Static method that GearsNativeDialog calls to unlock us - */ - public static void signalFinishedDialog() { - if (!mAsynchronousDialog) { - mLock.lock(); - mDialogFinished.signal(); - mLock.unlock(); - } else { - // we call the native callback - closeAsynchronousDialog(mResults); - } - } - - /** - * Static method that GearsNativeDialog calls to set the - * dialog's result - */ - public static void closeDialog(String res) { - mResults = res; - } - - /** - * Native callback method - */ - private native static void closeAsynchronousDialog(String res); -} diff --git a/core/java/android/webkit/gears/PluginSettings.java b/core/java/android/webkit/gears/PluginSettings.java deleted file mode 100644 index 2d0cc13..0000000 --- a/core/java/android/webkit/gears/PluginSettings.java +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2008 The Android Open Source Project -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// 3. Neither the name of Google Inc. nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package android.webkit.gears; - -import android.content.Context; -import android.util.Log; -import android.webkit.Plugin; -import android.webkit.Plugin.PreferencesClickHandler; - -/** - * Simple bridge class intercepting the click in the - * browser plugin list and calling the Gears settings - * dialog. - */ -public class PluginSettings { - - private static final String TAG = "Gears-J-PluginSettings"; - private Context mContext; - - public PluginSettings(Plugin plugin) { - plugin.setClickHandler(new ClickHandler()); - } - - /** - * We do not call the dialog synchronously here as the main - * message loop would be blocked, so we call it via a secondary thread. - */ - private class ClickHandler implements PreferencesClickHandler { - public void handleClickEvent(Context context) { - mContext = context.getApplicationContext(); - Thread startDialog = new Thread(new StartDialog(context)); - startDialog.start(); - } - } - - /** - * Simple wrapper class to call the gears native method in - * a separate thread (the native code will then instanciate a NativeDialog - * object which will start the GearsNativeDialog activity defined in - * the Browser). - */ - private class StartDialog implements Runnable { - Context mContext; - - public StartDialog(Context context) { - mContext = context; - } - - public void run() { - runSettingsDialog(mContext); - } - } - - private static native void runSettingsDialog(Context c); - -} diff --git a/core/java/android/webkit/gears/UrlInterceptHandlerGears.java b/core/java/android/webkit/gears/UrlInterceptHandlerGears.java deleted file mode 100644 index 43104bf..0000000 --- a/core/java/android/webkit/gears/UrlInterceptHandlerGears.java +++ /dev/null @@ -1,417 +0,0 @@ -// Copyright 2008, The Android Open Source Project -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// 3. Neither the name of Google Inc. nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package android.webkit.gears; - -import android.util.Log; -import android.webkit.CacheManager.CacheResult; -import android.webkit.Plugin; -import android.webkit.PluginData; -import android.webkit.UrlInterceptRegistry; -import android.webkit.UrlInterceptHandler; -import android.webkit.WebView; - -import org.apache.http.util.CharArrayBuffer; - -import java.io.*; -import java.util.*; - -/** - * Services requests to handle URLs coming from the browser or - * HttpRequestAndroid. This registers itself with the - * UrlInterceptRegister in Android so we get a chance to service all - * URLs passing through the browser before anything else. - */ -public class UrlInterceptHandlerGears implements UrlInterceptHandler { - /** Singleton instance. */ - private static UrlInterceptHandlerGears instance; - /** Debug logging tag. */ - private static final String LOG_TAG = "Gears-J"; - /** Buffer size for reading/writing streams. */ - private static final int BUFFER_SIZE = 4096; - /** Enable/disable all logging in this class. */ - private static boolean logEnabled = false; - /** The unmodified (case-sensitive) key in the headers map is the - * same index as used by HttpRequestAndroid. */ - public static final int HEADERS_MAP_INDEX_KEY = - ApacheHttpRequestAndroid.HEADERS_MAP_INDEX_KEY; - /** The associated value in the headers map is the same index as - * used by HttpRequestAndroid. */ - public static final int HEADERS_MAP_INDEX_VALUE = - ApacheHttpRequestAndroid.HEADERS_MAP_INDEX_VALUE; - - /** - * Object passed to the native side, containing information about - * the URL to service. - */ - public static class ServiceRequest { - // The URL being requested. - private String url; - // Request headers. Map of lowercase key to [ unmodified key, value ]. - private Map<String, String[]> requestHeaders; - - /** - * Initialize members on construction. - * @param url The URL being requested. - * @param requestHeaders Headers associated with the request, - * or null if none. - * Map of lowercase key to [ unmodified key, value ]. - */ - public ServiceRequest(String url, Map<String, String[]> requestHeaders) { - this.url = url; - this.requestHeaders = requestHeaders; - } - - /** - * Returns the URL being requested. - * @return The URL being requested. - */ - public String getUrl() { - return url; - } - - /** - * Get the value associated with a request header key, if any. - * @param header The key to find, case insensitive. - * @return The value associated with this header, or null if not found. - */ - public String getRequestHeader(String header) { - if (requestHeaders != null) { - String[] value = requestHeaders.get(header.toLowerCase()); - if (value != null) { - return value[HEADERS_MAP_INDEX_VALUE]; - } else { - return null; - } - } else { - return null; - } - } - } - - /** - * Object returned by the native side, containing information needed - * to pass the entire response back to the browser or - * HttpRequestAndroid. Works from either an in-memory array or a - * file on disk. - */ - public class ServiceResponse { - // The response status code, e.g 200. - private int statusCode; - // The full status line, e.g "HTTP/1.1 200 OK". - private String statusLine; - // All headers associated with the response. Map of lowercase key - // to [ unmodified key, value ]. - private Map<String, String[]> responseHeaders = - new HashMap<String, String[]>(); - // The MIME type, e.g "text/html". - private String mimeType; - // The encoding, e.g "utf-8", or null if none. - private String encoding; - // The stream which contains the body when read(). - private InputStream inputStream; - // The length of the content body. - private long contentLength; - - /** - * Initialize members using an in-memory array to return the body. - * @param statusCode The response status code, e.g 200. - * @param statusLine The full status line, e.g "HTTP/1.1 200 OK". - * @param mimeType The MIME type, e.g "text/html". - * @param encoding Encoding, e.g "utf-8" or null if none. - * @param body The response body as a byte array, non-empty. - */ - void setResultArray( - int statusCode, - String statusLine, - String mimeType, - String encoding, - byte[] body) { - this.statusCode = statusCode; - this.statusLine = statusLine; - this.mimeType = mimeType; - this.encoding = encoding; - // Setup a stream to read out of the byte array. - this.contentLength = body.length; - this.inputStream = new ByteArrayInputStream(body); - } - - /** - * Initialize members using a file on disk to return the body. - * @param statusCode The response status code, e.g 200. - * @param statusLine The full status line, e.g "HTTP/1.1 200 OK". - * @param mimeType The MIME type, e.g "text/html". - * @param encoding Encoding, e.g "utf-8" or null if none. - * @param path Full path to the file containing the body. - * @return True if the file is successfully setup to stream, - * false on error such as file not found. - */ - boolean setResultFile( - int statusCode, - String statusLine, - String mimeType, - String encoding, - String path) { - this.statusCode = statusCode; - this.statusLine = statusLine; - this.mimeType = mimeType; - this.encoding = encoding; - try { - // Setup a stream to read out of a file on disk. - File file = new File(path); - this.contentLength = file.length(); - this.inputStream = new FileInputStream(file); - return true; - } catch (java.io.FileNotFoundException ex) { - log("File not found: " + path); - return false; - } - } - - /** - * Set a response header, adding its settings to the header members. - * @param key The case sensitive key for the response header, - * e.g "Set-Cookie". - * @param value The value associated with this key, e.g "cookie1234". - */ - public void setResponseHeader(String key, String value) { - // The map value contains the unmodified key (not lowercase). - String[] mapValue = { key, value }; - responseHeaders.put(key.toLowerCase(), mapValue); - } - - /** - * Return the "Content-Type" header possibly supplied by a - * previous setResponseHeader(). - * @return The "Content-Type" value, or null if not present. - */ - public String getContentType() { - // The map keys are lowercase. - String[] value = responseHeaders.get("content-type"); - if (value != null) { - return value[HEADERS_MAP_INDEX_VALUE]; - } else { - return null; - } - } - - /** - * Returns the HTTP status code for the response, supplied in - * setResultArray() or setResultFile(). - * @return The HTTP statue code, e.g 200. - */ - public int getStatusCode() { - return statusCode; - } - - /** - * Returns the full HTTP status line for the response, supplied in - * setResultArray() or setResultFile(). - * @return The HTTP statue line, e.g "HTTP/1.1 200 OK". - */ - public String getStatusLine() { - return statusLine; - } - - /** - * Get all response headers supplied in calls in - * setResponseHeader(). - * @return A Map<String, String[]> containing all headers. - */ - public Map<String, String[]> getResponseHeaders() { - return responseHeaders; - } - - /** - * Returns the MIME type for the response, supplied in - * setResultArray() or setResultFile(). - * @return The MIME type, e.g "text/html". - */ - public String getMimeType() { - return mimeType; - } - - /** - * Returns the encoding for the response, supplied in - * setResultArray() or setResultFile(), or null if none. - * @return The encoding, e.g "utf-8", or null if none. - */ - public String getEncoding() { - return encoding; - } - - /** - * Returns the InputStream setup by setResultArray() or - * setResultFile() to allow reading data either from memory or - * disk. - * @return The InputStream containing the response body. - */ - public InputStream getInputStream() { - return inputStream; - } - - /** - * @return The length of the response body. - */ - public long getContentLength() { - return contentLength; - } - } - - /** - * Construct and initialize the singleton instance. - */ - public UrlInterceptHandlerGears() { - if (instance != null) { - Log.e(LOG_TAG, "UrlInterceptHandlerGears singleton already constructed"); - throw new RuntimeException(); - } - instance = this; - } - - /** - * Turn on/off logging in this class. - * @param on Logging enable state. - */ - public static void enableLogging(boolean on) { - logEnabled = on; - } - - /** - * Get the singleton instance. - * @return The singleton instance. - */ - public static UrlInterceptHandlerGears getInstance() { - return instance; - } - - /** - * Register the singleton instance with the browser's interception - * mechanism. - */ - public synchronized void register() { - UrlInterceptRegistry.registerHandler(this); - } - - /** - * Unregister the singleton instance from the browser's interception - * mechanism. - */ - public synchronized void unregister() { - UrlInterceptRegistry.unregisterHandler(this); - } - - /** - * Given an URL, returns the CacheResult which contains the - * surrogate response for the request, or null if the handler is - * not interested. - * - * @param url URL string. - * @param headers The headers associated with the request. May be null. - * @return The CacheResult containing the surrogate response. - * @Deprecated Use PluginData getPluginData(String url, - * Map<String, String> headers); instead - */ - @Deprecated - public CacheResult service(String url, Map<String, String> headers) { - throw new UnsupportedOperationException("unimplemented"); - } - - /** - * Given an URL, returns a PluginData instance which contains the - * response for the request. This implements the UrlInterceptHandler - * interface. - * - * @param url The fully qualified URL being requested. - * @param requestHeaders The request headers for this URL. - * @return a PluginData object. - */ - public PluginData getPluginData(String url, Map<String, String> requestHeaders) { - // Thankfully the browser does call us with case-sensitive - // headers. We just need to map it case-insensitive. - Map<String, String[]> lowercaseRequestHeaders = - new HashMap<String, String[]>(); - Iterator<Map.Entry<String, String>> requestHeadersIt = - requestHeaders.entrySet().iterator(); - while (requestHeadersIt.hasNext()) { - Map.Entry<String, String> entry = requestHeadersIt.next(); - String key = entry.getKey(); - String mapValue[] = { key, entry.getValue() }; - lowercaseRequestHeaders.put(key.toLowerCase(), mapValue); - } - ServiceResponse response = getServiceResponse(url, lowercaseRequestHeaders); - if (response == null) { - // No result for this URL. - return null; - } - return new PluginData(response.getInputStream(), - response.getContentLength(), - response.getResponseHeaders(), - response.getStatusCode()); - } - - /** - * Given an URL, returns a CacheResult and headers which contain the - * response for the request. - * - * @param url The fully qualified URL being requested. - * @param requestHeaders The request headers for this URL. - * @return If a response can be crafted, a ServiceResponse is - * created which contains all response headers and an InputStream - * attached to the body. If there is no response, null is returned. - */ - public ServiceResponse getServiceResponse(String url, - Map<String, String[]> requestHeaders) { - if (!url.startsWith("http://") && !url.startsWith("https://")) { - // Don't know how to service non-HTTP URLs - return null; - } - // Call the native handler to craft a response for this URL. - return nativeService(new ServiceRequest(url, requestHeaders)); - } - - /** - * Convenience debug function. Calls the Android logging - * mechanism. logEnabled is not a constant, so if the string - * evaluation is potentially expensive, the caller also needs to - * check it. - * @param str String to log to the Android console. - */ - private void log(String str) { - if (logEnabled) { - Log.i(LOG_TAG, str); - } - } - - /** - * Native method which handles the bulk of the request in LocalServer. - * @param request A ServiceRequest object containing information about - * the request. - * @return If serviced, a ServiceResponse object containing all the - * information to provide a response for the URL, or null - * if no response available for this URL. - */ - private native static ServiceResponse nativeService(ServiceRequest request); -} diff --git a/core/java/android/webkit/gears/VersionExtractor.java b/core/java/android/webkit/gears/VersionExtractor.java deleted file mode 100644 index 172dacb..0000000 --- a/core/java/android/webkit/gears/VersionExtractor.java +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2008, The Android Open Source Project -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// 3. Neither the name of Google Inc. nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package android.webkit.gears; - -import android.util.Log; -import java.io.IOException; -import java.io.StringReader; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.FactoryConfigurationError; -import javax.xml.parsers.ParserConfigurationException; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.w3c.dom.Document; -import org.w3c.dom.DOMException; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -/** - * A class that can extract the Gears version and upgrade URL from an - * xml document. - */ -public final class VersionExtractor { - - /** - * Logging tag - */ - private static final String TAG = "Gears-J-VersionExtractor"; - /** - * XML element names. - */ - private static final String VERSION = "em:version"; - private static final String URL = "em:updateLink"; - - /** - * Parses the input xml string and invokes the native - * setVersionAndUrl method. - * @param xml is the XML string to parse. - * @return true if the extraction is successful and false otherwise. - */ - public static boolean extract(String xml, long nativeObject) { - try { - // Build the builders. - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setNamespaceAware(false); - DocumentBuilder builder = factory.newDocumentBuilder(); - - // Create the document. - Document doc = builder.parse(new InputSource(new StringReader(xml))); - - // Look for the version and url elements and get their text - // contents. - String version = extractText(doc, VERSION); - String url = extractText(doc, URL); - - // If we have both, let the native side know. - if (version != null && url != null) { - setVersionAndUrl(version, url, nativeObject); - return true; - } - - return false; - - } catch (FactoryConfigurationError ex) { - Log.e(TAG, "Could not create the DocumentBuilderFactory " + ex); - } catch (ParserConfigurationException ex) { - Log.e(TAG, "Could not create the DocumentBuilder " + ex); - } catch (SAXException ex) { - Log.e(TAG, "Could not parse the xml " + ex); - } catch (IOException ex) { - Log.e(TAG, "Could not read the xml " + ex); - } - - return false; - } - - /** - * Extracts the text content of the first element with the given name. - * @param doc is the Document where the element is searched for. - * @param elementName is name of the element to searched for. - * @return the text content of the element or null if no such - * element is found. - */ - private static String extractText(Document doc, String elementName) { - String text = null; - NodeList node_list = doc.getElementsByTagName(elementName); - - if (node_list.getLength() > 0) { - // We are only interested in the first node. Normally there - // should not be more than one anyway. - Node node = node_list.item(0); - - // Iterate through the text children. - NodeList child_list = node.getChildNodes(); - - try { - for (int i = 0; i < child_list.getLength(); ++i) { - Node child = child_list.item(i); - if (child.getNodeType() == Node.TEXT_NODE) { - if (text == null) { - text = new String(); - } - text += child.getNodeValue(); - } - } - } catch (DOMException ex) { - Log.e(TAG, "getNodeValue() failed " + ex); - } - } - - if (text != null) { - text = text.trim(); - } - - return text; - } - - /** - * Native method used to send the version and url back to the C++ - * side. - */ - private static native void setVersionAndUrl( - String version, String url, long nativeObject); -} diff --git a/core/java/android/webkit/gears/ZipInflater.java b/core/java/android/webkit/gears/ZipInflater.java deleted file mode 100644 index f6b6be5..0000000 --- a/core/java/android/webkit/gears/ZipInflater.java +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright 2008, The Android Open Source Project -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// 3. Neither the name of Google Inc. nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package android.webkit.gears; - -import android.os.StatFs; -import android.util.Log; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.Enumeration; -import java.util.zip.CRC32; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; -import java.util.zip.ZipInputStream; - - -/** - * A class that can inflate a zip archive. - */ -public final class ZipInflater { - /** - * Logging tag - */ - private static final String TAG = "Gears-J-ZipInflater"; - - /** - * The size of the buffer used to read from the archive. - */ - private static final int BUFFER_SIZE_BYTES = 32 * 1024; // 32 KB. - /** - * The path navigation component (i.e. "../"). - */ - private static final String PATH_NAVIGATION_COMPONENT = ".." + File.separator; - /** - * The root of the data partition. - */ - private static final String DATA_PARTITION_ROOT = "/data"; - - /** - * We need two be able to store two versions of gears in parallel: - * - the zipped version - * - the unzipped version, which will be loaded next time the browser is started. - * We are conservative and do not attempt to unpack unless there enough free - * space on the device to store 4 times the new Gears size. - */ - private static final long SIZE_MULTIPLIER = 4; - - /** - * Unzips the archive with the given name. - * @param filename is the name of the zip to inflate. - * @param path is the path where the zip should be unpacked. It must contain - * a trailing separator, or the extraction will fail. - * @return true if the extraction is successful and false otherwise. - */ - public static boolean inflate(String filename, String path) { - Log.i(TAG, "Extracting " + filename + " to " + path); - - // Check that the path ends with a separator. - if (!path.endsWith(File.separator)) { - Log.e(TAG, "Path missing trailing separator: " + path); - return false; - } - - boolean result = false; - - // Use a ZipFile to get an enumeration of the entries and - // calculate the overall uncompressed size of the archive. Also - // check for existing files or directories that have the same - // name as the entries in the archive. Also check for invalid - // entry names (e.g names that attempt to navigate to the - // parent directory). - ZipInputStream zipStream = null; - long uncompressedSize = 0; - try { - ZipFile zipFile = new ZipFile(filename); - try { - Enumeration entries = zipFile.entries(); - while (entries.hasMoreElements()) { - ZipEntry entry = (ZipEntry) entries.nextElement(); - uncompressedSize += entry.getSize(); - // Check against entry names that may attempt to navigate - // out of the destination directory. - if (entry.getName().indexOf(PATH_NAVIGATION_COMPONENT) >= 0) { - throw new IOException("Illegal entry name: " + entry.getName()); - } - - // Check against entries with the same name as pre-existing files or - // directories. - File file = new File(path + entry.getName()); - if (file.exists()) { - // A file or directory with the same name already exist. - // This must not happen, so we treat this as an error. - throw new IOException( - "A file or directory with the same name already exists."); - } - } - } finally { - zipFile.close(); - } - - Log.i(TAG, "Determined uncompressed size: " + uncompressedSize); - // Check we have enough space to unpack this archive. - if (freeSpace() <= uncompressedSize * SIZE_MULTIPLIER) { - throw new IOException("Not enough space to unpack this archive."); - } - - zipStream = new ZipInputStream( - new BufferedInputStream(new FileInputStream(filename))); - ZipEntry entry; - int counter; - byte buffer[] = new byte[BUFFER_SIZE_BYTES]; - - // Iterate through the entries and write each of them to a file. - while ((entry = zipStream.getNextEntry()) != null) { - File file = new File(path + entry.getName()); - if (entry.isDirectory()) { - // If the entry denotes a directory, we need to create a - // directory with the same name. - file.mkdirs(); - } else { - CRC32 checksum = new CRC32(); - BufferedOutputStream output = new BufferedOutputStream( - new FileOutputStream(file), - BUFFER_SIZE_BYTES); - try { - // Read the entry and write it to the file. - while ((counter = zipStream.read(buffer, 0, BUFFER_SIZE_BYTES)) != - -1) { - output.write(buffer, 0, counter); - checksum.update(buffer, 0, counter); - } - output.flush(); - } finally { - output.close(); - } - - if (checksum.getValue() != entry.getCrc()) { - throw new IOException( - "Integrity check failed for: " + entry.getName()); - } - } - zipStream.closeEntry(); - } - - result = true; - - } catch (FileNotFoundException ex) { - Log.e(TAG, "The zip file could not be found. " + ex); - } catch (IOException ex) { - Log.e(TAG, "Could not read or write an entry. " + ex); - } catch(IllegalArgumentException ex) { - Log.e(TAG, "Could not create the BufferedOutputStream. " + ex); - } finally { - if (zipStream != null) { - try { - zipStream.close(); - } catch (IOException ex) { - // Ignored. - } - } - // Discard any exceptions and return the result to the native side. - return result; - } - } - - private static final long freeSpace() { - StatFs data_partition = new StatFs(DATA_PARTITION_ROOT); - long freeSpace = data_partition.getAvailableBlocks() * - data_partition.getBlockSize(); - Log.i(TAG, "Free space on the data partition: " + freeSpace); - return freeSpace; - } -} diff --git a/core/java/android/webkit/gears/package.html b/core/java/android/webkit/gears/package.html deleted file mode 100644 index db6f78b..0000000 --- a/core/java/android/webkit/gears/package.html +++ /dev/null @@ -1,3 +0,0 @@ -<body> -{@hide} -</body>
\ No newline at end of file diff --git a/tools/layoutlib/bridge/src/android/webkit/WebView.java b/tools/layoutlib/bridge/src/android/webkit/WebView.java index 42e4dfa..3b66188 100644 --- a/tools/layoutlib/bridge/src/android/webkit/WebView.java +++ b/tools/layoutlib/bridge/src/android/webkit/WebView.java @@ -240,13 +240,6 @@ public class WebView extends MockView { return null; } - public static synchronized PluginList getPluginList() { - return null; - } - - public void refreshPlugins(boolean reloadOpenPages) { - } - public View getZoomControls() { return null; } |