19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.webkit; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map.Entry; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.DatabaseUtils; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteStatement; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.webkit.CookieManager.Cookie; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.webkit.CacheManager.CacheResult; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class WebViewDatabase { 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String DATABASE_FILE = "webview.db"; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String CACHE_DATABASE_FILE = "webviewCache.db"; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // log tag 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static final String LOGTAG = "webviewdatabase"; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba private static final int DATABASE_VERSION = 10; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 2 -> 3 Modified Cache table to allow cache of redirects 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 3 -> 4 Added Oma-Downloads table 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 4 -> 5 Modified Cache table to support persistent contentLength 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 5 -> 4 Removed Oma-Downoads table 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 5 -> 6 Add INDEX for cache table 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 6 -> 7 Change cache localPath from int to String 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 7 -> 8 Move cache to its own db 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 8 -> 9 Store both scheme and host when storing passwords 51b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba // 9 -> 10 Update httpauth table UNIQUE 520b956e1353a691674cb22c899c5a444b92532b60Grace Kloba private static final int CACHE_DATABASE_VERSION = 3; 53e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba // 1 -> 2 Add expires String 540b956e1353a691674cb22c899c5a444b92532b60Grace Kloba // 2 -> 3 Add content-disposition 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static WebViewDatabase mInstance = null; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static SQLiteDatabase mDatabase = null; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static SQLiteDatabase mCacheDatabase = null; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // synchronize locks 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Object mCookieLock = new Object(); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Object mPasswordLock = new Object(); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Object mFormLock = new Object(); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Object mHttpAuthLock = new Object(); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String mTableNames[] = { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "cookies", "password", "formurl", "formdata", "httpauth" 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Table ids (they are index to mTableNames) 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int TABLE_COOKIES_ID = 0; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int TABLE_PASSWORD_ID = 1; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int TABLE_FORMURL_ID = 2; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int TABLE_FORMDATA_ID = 3; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int TABLE_HTTPAUTH_ID = 4; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // column id strings for "_id" which can be used by any table 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String ID_COL = "_id"; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String[] ID_PROJECTION = new String[] { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "_id" 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // column id strings for "cookies" table 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String COOKIES_NAME_COL = "name"; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String COOKIES_VALUE_COL = "value"; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String COOKIES_DOMAIN_COL = "domain"; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String COOKIES_PATH_COL = "path"; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String COOKIES_EXPIRES_COL = "expires"; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String COOKIES_SECURE_COL = "secure"; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // column id strings for "cache" table 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String CACHE_URL_COL = "url"; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String CACHE_FILE_PATH_COL = "filepath"; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String CACHE_LAST_MODIFY_COL = "lastmodify"; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String CACHE_ETAG_COL = "etag"; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String CACHE_EXPIRES_COL = "expires"; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 113e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba private static final String CACHE_EXPIRES_STRING_COL = "expiresstring"; 114e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String CACHE_MIMETYPE_COL = "mimetype"; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String CACHE_ENCODING_COL = "encoding"; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String CACHE_HTTP_STATUS_COL = "httpstatus"; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String CACHE_LOCATION_COL = "location"; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String CACHE_CONTENTLENGTH_COL = "contentlength"; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1250b956e1353a691674cb22c899c5a444b92532b60Grace Kloba private static final String CACHE_CONTENTDISPOSITION_COL = "contentdisposition"; 1260b956e1353a691674cb22c899c5a444b92532b60Grace Kloba 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // column id strings for "password" table 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String PASSWORD_HOST_COL = "host"; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String PASSWORD_USERNAME_COL = "username"; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String PASSWORD_PASSWORD_COL = "password"; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // column id strings for "formurl" table 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String FORMURL_URL_COL = "url"; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // column id strings for "formdata" table 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String FORMDATA_URLID_COL = "urlid"; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String FORMDATA_NAME_COL = "name"; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String FORMDATA_VALUE_COL = "value"; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // column id strings for "httpauth" table 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String HTTPAUTH_HOST_COL = "host"; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String HTTPAUTH_REALM_COL = "realm"; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String HTTPAUTH_USERNAME_COL = "username"; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String HTTPAUTH_PASSWORD_COL = "password"; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // use InsertHelper to improve insert performance by 40% 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static DatabaseUtils.InsertHelper mCacheInserter; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int mCacheUrlColIndex; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int mCacheFilePathColIndex; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int mCacheLastModifyColIndex; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int mCacheETagColIndex; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int mCacheExpiresColIndex; 160e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba private static int mCacheExpiresStringColIndex; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int mCacheMimeTypeColIndex; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int mCacheEncodingColIndex; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int mCacheHttpStatusColIndex; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int mCacheLocationColIndex; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int mCacheContentLengthColIndex; 1660b956e1353a691674cb22c899c5a444b92532b60Grace Kloba private static int mCacheContentDispositionColIndex; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int mCacheTransactionRefcount; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WebViewDatabase() { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Singleton only, use getInstance() 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static synchronized WebViewDatabase getInstance(Context context) { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInstance == null) { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInstance = new WebViewDatabase(); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase = context.openOrCreateDatabase(DATABASE_FILE, 0, null); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // mDatabase should not be null, 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the only case is RequestAPI test has problem to create db 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabase != null && mDatabase.getVersion() != DATABASE_VERSION) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.beginTransaction(); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project upgradeDatabase(); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.setTransactionSuccessful(); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.endTransaction(); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabase != null) { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // use per table Mutex lock, turn off database lock, this 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // improves performance as database's ReentrantLock is expansive 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.setLockingEnabled(false); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDatabase = context.openOrCreateDatabase(CACHE_DATABASE_FILE, 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0, null); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // mCacheDatabase should not be null, 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the only case is RequestAPI test has problem to create db 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCacheDatabase != null 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && mCacheDatabase.getVersion() != CACHE_DATABASE_VERSION) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDatabase.beginTransaction(); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project upgradeCacheDatabase(); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bootstrapCacheDatabase(); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDatabase.setTransactionSuccessful(); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDatabase.endTransaction(); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Erase the files from the file system in the 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // case that the database was updated and the 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // there were existing cache content 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CacheManager.removeAllCacheFiles(); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCacheDatabase != null) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // use InsertHelper for faster insertion 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheInserter = new DatabaseUtils.InsertHelper(mCacheDatabase, 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "cache"); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheUrlColIndex = mCacheInserter 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getColumnIndex(CACHE_URL_COL); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheFilePathColIndex = mCacheInserter 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getColumnIndex(CACHE_FILE_PATH_COL); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheLastModifyColIndex = mCacheInserter 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getColumnIndex(CACHE_LAST_MODIFY_COL); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheETagColIndex = mCacheInserter 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getColumnIndex(CACHE_ETAG_COL); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheExpiresColIndex = mCacheInserter 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getColumnIndex(CACHE_EXPIRES_COL); 232e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba mCacheExpiresStringColIndex = mCacheInserter 233e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba .getColumnIndex(CACHE_EXPIRES_STRING_COL); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheMimeTypeColIndex = mCacheInserter 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getColumnIndex(CACHE_MIMETYPE_COL); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheEncodingColIndex = mCacheInserter 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getColumnIndex(CACHE_ENCODING_COL); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheHttpStatusColIndex = mCacheInserter 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getColumnIndex(CACHE_HTTP_STATUS_COL); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheLocationColIndex = mCacheInserter 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getColumnIndex(CACHE_LOCATION_COL); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheContentLengthColIndex = mCacheInserter 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getColumnIndex(CACHE_CONTENTLENGTH_COL); 2440b956e1353a691674cb22c899c5a444b92532b60Grace Kloba mCacheContentDispositionColIndex = mCacheInserter 2450b956e1353a691674cb22c899c5a444b92532b60Grace Kloba .getColumnIndex(CACHE_CONTENTDISPOSITION_COL); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInstance; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void upgradeDatabase() { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int oldVersion = mDatabase.getVersion(); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldVersion != 0) { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(LOGTAG, "Upgrading database from version " 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + oldVersion + " to " 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + DATABASE_VERSION + ", which will destroy old data"); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean justPasswords = 8 == oldVersion && 9 == DATABASE_VERSION; 260b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba boolean justAuth = 9 == oldVersion && 10 == DATABASE_VERSION; 261b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba if (justAuth) { 262b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba mDatabase.execSQL("DROP TABLE IF EXISTS " 263b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba + mTableNames[TABLE_HTTPAUTH_ID]); 264b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba mDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_HTTPAUTH_ID] 265b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba + " (" + ID_COL + " INTEGER PRIMARY KEY, " 266b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba + HTTPAUTH_HOST_COL + " TEXT, " + HTTPAUTH_REALM_COL 267b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba + " TEXT, " + HTTPAUTH_USERNAME_COL + " TEXT, " 268b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba + HTTPAUTH_PASSWORD_COL + " TEXT," + " UNIQUE (" 269b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba + HTTPAUTH_HOST_COL + ", " + HTTPAUTH_REALM_COL 270b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba + ") ON CONFLICT REPLACE);"); 271b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba return; 272b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba } 273b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!justPasswords) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.execSQL("DROP TABLE IF EXISTS " 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mTableNames[TABLE_COOKIES_ID]); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.execSQL("DROP TABLE IF EXISTS cache"); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.execSQL("DROP TABLE IF EXISTS " 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mTableNames[TABLE_FORMURL_ID]); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.execSQL("DROP TABLE IF EXISTS " 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mTableNames[TABLE_FORMDATA_ID]); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.execSQL("DROP TABLE IF EXISTS " 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mTableNames[TABLE_HTTPAUTH_ID]); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.execSQL("DROP TABLE IF EXISTS " 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mTableNames[TABLE_PASSWORD_ID]); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.setVersion(DATABASE_VERSION); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!justPasswords) { 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // cookies 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_COOKIES_ID] 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " (" + ID_COL + " INTEGER PRIMARY KEY, " 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + COOKIES_NAME_COL + " TEXT, " + COOKIES_VALUE_COL 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " TEXT, " + COOKIES_DOMAIN_COL + " TEXT, " 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + COOKIES_PATH_COL + " TEXT, " + COOKIES_EXPIRES_COL 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " INTEGER, " + COOKIES_SECURE_COL + " INTEGER" + ");"); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.execSQL("CREATE INDEX cookiesIndex ON " 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mTableNames[TABLE_COOKIES_ID] + " (path)"); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // formurl 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_FORMURL_ID] 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " (" + ID_COL + " INTEGER PRIMARY KEY, " + FORMURL_URL_COL 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " TEXT" + ");"); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // formdata 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_FORMDATA_ID] 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " (" + ID_COL + " INTEGER PRIMARY KEY, " 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + FORMDATA_URLID_COL + " INTEGER, " + FORMDATA_NAME_COL 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " TEXT, " + FORMDATA_VALUE_COL + " TEXT," + " UNIQUE (" 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + FORMDATA_URLID_COL + ", " + FORMDATA_NAME_COL + ", " 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + FORMDATA_VALUE_COL + ") ON CONFLICT IGNORE);"); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // httpauth 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_HTTPAUTH_ID] 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " (" + ID_COL + " INTEGER PRIMARY KEY, " 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + HTTPAUTH_HOST_COL + " TEXT, " + HTTPAUTH_REALM_COL 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " TEXT, " + HTTPAUTH_USERNAME_COL + " TEXT, " 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + HTTPAUTH_PASSWORD_COL + " TEXT," + " UNIQUE (" 320b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba + HTTPAUTH_HOST_COL + ", " + HTTPAUTH_REALM_COL 321b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba + ") ON CONFLICT REPLACE);"); 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // passwords 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_PASSWORD_ID] 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " (" + ID_COL + " INTEGER PRIMARY KEY, " 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + PASSWORD_HOST_COL + " TEXT, " + PASSWORD_USERNAME_COL 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " TEXT, " + PASSWORD_PASSWORD_COL + " TEXT," + " UNIQUE (" 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + PASSWORD_HOST_COL + ", " + PASSWORD_USERNAME_COL 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ") ON CONFLICT REPLACE);"); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void upgradeCacheDatabase() { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int oldVersion = mCacheDatabase.getVersion(); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldVersion != 0) { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(LOGTAG, "Upgrading cache database from version " 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + oldVersion + " to " 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + DATABASE_VERSION + ", which will destroy all old data"); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDatabase.execSQL("DROP TABLE IF EXISTS cache"); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDatabase.setVersion(CACHE_DATABASE_VERSION); 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void bootstrapCacheDatabase() { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCacheDatabase != null) { 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDatabase.execSQL("CREATE TABLE cache" 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " (" + ID_COL + " INTEGER PRIMARY KEY, " + CACHE_URL_COL 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " TEXT, " + CACHE_FILE_PATH_COL + " TEXT, " 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + CACHE_LAST_MODIFY_COL + " TEXT, " + CACHE_ETAG_COL 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " TEXT, " + CACHE_EXPIRES_COL + " INTEGER, " 350e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba + CACHE_EXPIRES_STRING_COL + " TEXT, " 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + CACHE_MIMETYPE_COL + " TEXT, " + CACHE_ENCODING_COL 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " TEXT," + CACHE_HTTP_STATUS_COL + " INTEGER, " 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + CACHE_LOCATION_COL + " TEXT, " + CACHE_CONTENTLENGTH_COL 3540b956e1353a691674cb22c899c5a444b92532b60Grace Kloba + " INTEGER, " + CACHE_CONTENTDISPOSITION_COL + " TEXT, " 3550b956e1353a691674cb22c899c5a444b92532b60Grace Kloba + " UNIQUE (" + CACHE_URL_COL + ") ON CONFLICT REPLACE);"); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDatabase.execSQL("CREATE INDEX cacheUrlIndex ON cache (" 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + CACHE_URL_COL + ")"); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean hasEntries(int tableId) { 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabase == null) { 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor cursor = mDatabase.query(mTableNames[tableId], ID_PROJECTION, 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, null, null, null, null); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean ret = cursor.moveToFirst() == true; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.close(); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // cookies functions 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get cookies in the format of CookieManager.Cookie inside an ArrayList for 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a given domain 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return ArrayList<Cookie> If nothing is found, return an empty list. 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<Cookie> getCookiesForDomain(String domain) { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<Cookie> list = new ArrayList<Cookie>(); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (domain == null || mDatabase == null) { 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return list; 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mCookieLock) { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String[] columns = new String[] { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ID_COL, COOKIES_DOMAIN_COL, COOKIES_PATH_COL, 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project COOKIES_NAME_COL, COOKIES_VALUE_COL, COOKIES_EXPIRES_COL, 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project COOKIES_SECURE_COL 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String selection = "(" + COOKIES_DOMAIN_COL 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " GLOB '*' || ?)"; 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor cursor = mDatabase.query(mTableNames[TABLE_COOKIES_ID], 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project columns, selection, new String[] { domain }, null, null, 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor.moveToFirst()) { 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int domainCol = cursor.getColumnIndex(COOKIES_DOMAIN_COL); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pathCol = cursor.getColumnIndex(COOKIES_PATH_COL); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nameCol = cursor.getColumnIndex(COOKIES_NAME_COL); 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int valueCol = cursor.getColumnIndex(COOKIES_VALUE_COL); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int expiresCol = cursor.getColumnIndex(COOKIES_EXPIRES_COL); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int secureCol = cursor.getColumnIndex(COOKIES_SECURE_COL); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cookie cookie = new Cookie(); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cookie.domain = cursor.getString(domainCol); 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cookie.path = cursor.getString(pathCol); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cookie.name = cursor.getString(nameCol); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cookie.value = cursor.getString(valueCol); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor.isNull(expiresCol)) { 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cookie.expires = -1; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cookie.expires = cursor.getLong(expiresCol); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cookie.secure = cursor.getShort(secureCol) != 0; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cookie.mode = Cookie.MODE_NORMAL; 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.add(cookie); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (cursor.moveToNext()); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.close(); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return list; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Delete cookies which matches (domain, path, name). 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param domain If it is null, nothing happens. 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param path If it is null, all the cookies match (domain) will be 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * deleted. 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param name If it is null, all the cookies match (domain, path) will be 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * deleted. 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void deleteCookies(String domain, String path, String name) { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (domain == null || mDatabase == null) { 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mCookieLock) { 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String where = "(" + COOKIES_DOMAIN_COL + " == ?) AND (" 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + COOKIES_PATH_COL + " == ?) AND (" + COOKIES_NAME_COL 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " == ?)"; 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.delete(mTableNames[TABLE_COOKIES_ID], where, 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String[] { domain, path, name }); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a cookie to the database 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cookie 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void addCookie(Cookie cookie) { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cookie.domain == null || cookie.path == null || cookie.name == null 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || mDatabase == null) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mCookieLock) { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues cookieVal = new ContentValues(); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cookieVal.put(COOKIES_DOMAIN_COL, cookie.domain); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cookieVal.put(COOKIES_PATH_COL, cookie.path); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cookieVal.put(COOKIES_NAME_COL, cookie.name); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cookieVal.put(COOKIES_VALUE_COL, cookie.value); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cookie.expires != -1) { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cookieVal.put(COOKIES_EXPIRES_COL, cookie.expires); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cookieVal.put(COOKIES_SECURE_COL, cookie.secure); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.insert(mTableNames[TABLE_COOKIES_ID], null, cookieVal); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether there is any cookies in the database 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return TRUE if there is cookie. 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasCookies() { 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mCookieLock) { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hasEntries(TABLE_COOKIES_ID); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clear cookie database 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void clearCookies() { 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabase == null) { 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mCookieLock) { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.delete(mTableNames[TABLE_COOKIES_ID], null, null); 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clear session cookies, which means cookie doesn't have EXPIRES. 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void clearSessionCookies() { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabase == null) { 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String sessionExpired = COOKIES_EXPIRES_COL + " ISNULL"; 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mCookieLock) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.delete(mTableNames[TABLE_COOKIES_ID], sessionExpired, 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clear expired cookies 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param now Time for now 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void clearExpiredCookies(long now) { 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabase == null) { 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String expires = COOKIES_EXPIRES_COL + " <= ?"; 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mCookieLock) { 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.delete(mTableNames[TABLE_COOKIES_ID], expires, 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String[] { Long.toString(now) }); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // cache functions, can only be called from WebCoreThread 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean startCacheTransaction() { 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (++mCacheTransactionRefcount == 1) { 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDatabase.beginTransaction(); 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean endCacheTransaction() { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (--mCacheTransactionRefcount == 0) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDatabase.setTransactionSuccessful(); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDatabase.endTransaction(); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get a cache item. 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url The url 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return CacheResult The CacheManager.CacheResult 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CacheResult getCache(String url) { 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (url == null || mCacheDatabase == null) { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor cursor = mCacheDatabase.rawQuery("SELECT filepath, lastmodify, etag, expires, " 5680b956e1353a691674cb22c899c5a444b92532b60Grace Kloba + "expiresstring, mimetype, encoding, httpstatus, location, contentlength, " 5690b956e1353a691674cb22c899c5a444b92532b60Grace Kloba + "contentdisposition FROM cache WHERE url = ?", 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String[] { url }); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor.moveToFirst()) { 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CacheResult ret = new CacheResult(); 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret.localPath = cursor.getString(0); 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret.lastModified = cursor.getString(1); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret.etag = cursor.getString(2); 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret.expires = cursor.getLong(3); 579e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba ret.expiresString = cursor.getString(4); 580e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba ret.mimeType = cursor.getString(5); 581e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba ret.encoding = cursor.getString(6); 582e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba ret.httpStatusCode = cursor.getInt(7); 583e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba ret.location = cursor.getString(8); 584e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba ret.contentLength = cursor.getLong(9); 5850b956e1353a691674cb22c899c5a444b92532b60Grace Kloba ret.contentdisposition = cursor.getString(10); 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor != null) cursor.close(); 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove a cache item. 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url The url 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void removeCache(String url) { 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (url == null || mCacheDatabase == null) { 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDatabase.execSQL("DELETE FROM cache WHERE url = ?", new String[] { url }); 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add or update a cache. CACHE_URL_COL is unique in the table. 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url The url 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c The CacheManager.CacheResult 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void addCache(String url, CacheResult c) { 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (url == null || mCacheDatabase == null) { 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheInserter.prepareForInsert(); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheInserter.bind(mCacheUrlColIndex, url); 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheInserter.bind(mCacheFilePathColIndex, c.localPath); 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheInserter.bind(mCacheLastModifyColIndex, c.lastModified); 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheInserter.bind(mCacheETagColIndex, c.etag); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheInserter.bind(mCacheExpiresColIndex, c.expires); 624e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba mCacheInserter.bind(mCacheExpiresStringColIndex, c.expiresString); 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheInserter.bind(mCacheMimeTypeColIndex, c.mimeType); 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheInserter.bind(mCacheEncodingColIndex, c.encoding); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheInserter.bind(mCacheHttpStatusColIndex, c.httpStatusCode); 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheInserter.bind(mCacheLocationColIndex, c.location); 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheInserter.bind(mCacheContentLengthColIndex, c.contentLength); 6300b956e1353a691674cb22c899c5a444b92532b60Grace Kloba mCacheInserter.bind(mCacheContentDispositionColIndex, 6310b956e1353a691674cb22c899c5a444b92532b60Grace Kloba c.contentdisposition); 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheInserter.execute(); 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clear cache database 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void clearCache() { 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCacheDatabase == null) { 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDatabase.delete("cache", null, null); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasCache() { 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCacheDatabase == null) { 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor cursor = mCacheDatabase.query("cache", ID_PROJECTION, 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, null, null, null, null); 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean ret = cursor.moveToFirst() == true; 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.close(); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getCacheTotalSize() { 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long size = 0; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor cursor = mCacheDatabase.rawQuery( 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "SELECT SUM(contentlength) as sum FROM cache", null); 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor.moveToFirst()) { 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size = cursor.getLong(0); 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.close(); 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return size; 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<String> trimCache(long amount) { 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<String> pathList = new ArrayList<String>(100); 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor cursor = mCacheDatabase.rawQuery( 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "SELECT contentlength, filepath FROM cache ORDER BY expires ASC", 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null); 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor.moveToFirst()) { 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int batchSize = 100; 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder pathStr = new StringBuilder(20 + 16 * batchSize); 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pathStr.append("DELETE FROM cache WHERE filepath IN (?"); 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 1; i < batchSize; i++) { 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pathStr.append(", ?"); 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pathStr.append(")"); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SQLiteStatement statement = mCacheDatabase.compileStatement(pathStr 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .toString()); 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // as bindString() uses 1-based index, initialize index to 1 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = 1; 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long length = cursor.getLong(0); 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (length == 0) { 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project amount -= length; 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String filePath = cursor.getString(1); 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project statement.bindString(index, filePath); 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pathList.add(filePath); 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index++ == batchSize) { 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project statement.execute(); 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project statement.clearBindings(); 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = 1; 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (cursor.moveToNext() && amount > 0); 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index > 1) { 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // there may be old bindings from the previous statement if 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // index is less than batchSize, which is Ok. 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project statement.execute(); 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project statement.close(); 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.close(); 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pathList; 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // password functions 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set password. Tuple (PASSWORD_HOST_COL, PASSWORD_USERNAME_COL) is unique. 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param schemePlusHost The scheme and host for the password 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param username The username for the password. If it is null, it means 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * password can't be saved. 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param password The password 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setUsernamePassword(String schemePlusHost, String username, 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String password) { 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (schemePlusHost == null || mDatabase == null) { 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mPasswordLock) { 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ContentValues c = new ContentValues(); 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.put(PASSWORD_HOST_COL, schemePlusHost); 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.put(PASSWORD_USERNAME_COL, username); 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.put(PASSWORD_PASSWORD_COL, password); 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.insert(mTableNames[TABLE_PASSWORD_ID], PASSWORD_HOST_COL, 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c); 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the username and password for a given host 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param schemePlusHost The scheme and host which passwords applies to 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return String[] if found, String[0] is username, which can be null and 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * String[1] is password. Return null if it can't find anything. 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] getUsernamePassword(String schemePlusHost) { 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (schemePlusHost == null || mDatabase == null) { 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String[] columns = new String[] { 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PASSWORD_USERNAME_COL, PASSWORD_PASSWORD_COL 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String selection = "(" + PASSWORD_HOST_COL + " == ?)"; 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mPasswordLock) { 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] ret = null; 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor cursor = mDatabase.query(mTableNames[TABLE_PASSWORD_ID], 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project columns, selection, new String[] { schemePlusHost }, null, 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, null); 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor.moveToFirst()) { 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret = new String[2]; 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret[0] = cursor.getString( 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getColumnIndex(PASSWORD_USERNAME_COL)); 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret[1] = cursor.getString( 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getColumnIndex(PASSWORD_PASSWORD_COL)); 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.close(); 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Find out if there are any passwords saved. 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return TRUE if there is passwords saved 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasUsernamePassword() { 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mPasswordLock) { 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hasEntries(TABLE_PASSWORD_ID); 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clear password database 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearUsernamePassword() { 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabase == null) { 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mPasswordLock) { 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.delete(mTableNames[TABLE_PASSWORD_ID], null, null); 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // http authentication password functions 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set HTTP authentication password. Tuple (HTTPAUTH_HOST_COL, 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * HTTPAUTH_REALM_COL, HTTPAUTH_USERNAME_COL) is unique. 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param host The host for the password 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param realm The realm for the password 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param username The username for the password. If it is null, it means 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * password can't be saved. 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param password The password 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setHttpAuthUsernamePassword(String host, String realm, String username, 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String password) { 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (host == null || realm == null || mDatabase == null) { 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mHttpAuthLock) { 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ContentValues c = new ContentValues(); 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.put(HTTPAUTH_HOST_COL, host); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.put(HTTPAUTH_REALM_COL, realm); 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.put(HTTPAUTH_USERNAME_COL, username); 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.put(HTTPAUTH_PASSWORD_COL, password); 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.insert(mTableNames[TABLE_HTTPAUTH_ID], HTTPAUTH_HOST_COL, 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c); 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the HTTP authentication username and password for a given 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * host+realm pair 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param host The host the password applies to 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param realm The realm the password applies to 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return String[] if found, String[0] is username, which can be null and 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * String[1] is password. Return null if it can't find anything. 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] getHttpAuthUsernamePassword(String host, String realm) { 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (host == null || realm == null || mDatabase == null){ 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String[] columns = new String[] { 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HTTPAUTH_USERNAME_COL, HTTPAUTH_PASSWORD_COL 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String selection = "(" + HTTPAUTH_HOST_COL + " == ?) AND (" 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + HTTPAUTH_REALM_COL + " == ?)"; 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mHttpAuthLock) { 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] ret = null; 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor cursor = mDatabase.query(mTableNames[TABLE_HTTPAUTH_ID], 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project columns, selection, new String[] { host, realm }, null, 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, null); 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor.moveToFirst()) { 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret = new String[2]; 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret[0] = cursor.getString( 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getColumnIndex(HTTPAUTH_USERNAME_COL)); 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret[1] = cursor.getString( 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getColumnIndex(HTTPAUTH_PASSWORD_COL)); 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.close(); 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Find out if there are any HTTP authentication passwords saved. 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return TRUE if there are passwords saved 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasHttpAuthUsernamePassword() { 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mHttpAuthLock) { 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hasEntries(TABLE_HTTPAUTH_ID); 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clear HTTP authentication password database 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearHttpAuthUsernamePassword() { 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabase == null) { 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mHttpAuthLock) { 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.delete(mTableNames[TABLE_HTTPAUTH_ID], null, null); 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // form data functions 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set form data for a site. Tuple (FORMDATA_URLID_COL, FORMDATA_NAME_COL, 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * FORMDATA_VALUE_COL) is unique 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url The url of the site 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param formdata The form data in HashMap 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setFormData(String url, HashMap<String, String> formdata) { 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (url == null || formdata == null || mDatabase == null) { 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String selection = "(" + FORMURL_URL_COL + " == ?)"; 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mFormLock) { 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long urlid = -1; 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor cursor = mDatabase.query(mTableNames[TABLE_FORMURL_ID], 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ID_PROJECTION, selection, new String[] { url }, null, null, 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null); 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor.moveToFirst()) { 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project urlid = cursor.getLong(cursor.getColumnIndex(ID_COL)); 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues c = new ContentValues(); 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.put(FORMURL_URL_COL, url); 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project urlid = mDatabase.insert( 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTableNames[TABLE_FORMURL_ID], null, c); 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.close(); 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (urlid >= 0) { 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Set<Entry<String, String>> set = formdata.entrySet(); 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Iterator<Entry<String, String>> iter = set.iterator(); 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues map = new ContentValues(); 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(FORMDATA_URLID_COL, urlid); 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (iter.hasNext()) { 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Entry<String, String> entry = iter.next(); 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(FORMDATA_NAME_COL, entry.getKey()); 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(FORMDATA_VALUE_COL, entry.getValue()); 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.insert(mTableNames[TABLE_FORMDATA_ID], null, map); 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get all the values for a form entry with "name" in a given site 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url The url of the site 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param name The name of the form entry 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A list of values. Return empty list if nothing is found. 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<String> getFormData(String url, String name) { 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<String> values = new ArrayList<String>(); 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (url == null || name == null || mDatabase == null) { 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return values; 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String urlSelection = "(" + FORMURL_URL_COL + " == ?)"; 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String dataSelection = "(" + FORMDATA_URLID_COL + " == ?) AND (" 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + FORMDATA_NAME_COL + " == ?)"; 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mFormLock) { 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor cursor = mDatabase.query(mTableNames[TABLE_FORMURL_ID], 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ID_PROJECTION, urlSelection, new String[] { url }, null, 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, null); 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor.moveToFirst()) { 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long urlid = cursor.getLong(cursor.getColumnIndex(ID_COL)); 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor dataCursor = mDatabase.query( 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTableNames[TABLE_FORMDATA_ID], 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String[] { ID_COL, FORMDATA_VALUE_COL }, 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dataSelection, 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new String[] { Long.toString(urlid), name }, null, 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, null); 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dataCursor.moveToFirst()) { 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int valueCol = 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dataCursor.getColumnIndex(FORMDATA_VALUE_COL); 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.add(dataCursor.getString(valueCol)); 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (dataCursor.moveToNext()); 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dataCursor.close(); 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.close(); 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return values; 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Find out if there is form data saved. 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return TRUE if there is form data in the database 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasFormData() { 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mFormLock) { 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hasEntries(TABLE_FORMURL_ID); 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clear form database 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearFormData() { 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabase == null) { 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mFormLock) { 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.delete(mTableNames[TABLE_FORMURL_ID], null, null); 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabase.delete(mTableNames[TABLE_FORMDATA_ID], null, null); 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1001