diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2008-10-21 07:00:00 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2008-10-21 07:00:00 -0700 |
commit | 6b8295c9350c603bdd930a29a877c8e95f4641ac (patch) | |
tree | a67d9b3d359ee91938cb1be72d914261a86c4c6a | |
download | DrmProvider-cdma-import.tar.gz |
Initial Contributionandroid-1.0release-1.0cdma-import
-rw-r--r-- | Android.mk | 13 | ||||
-rw-r--r-- | AndroidManifest.xml | 28 | ||||
-rw-r--r-- | MODULE_LICENSE_APACHE2 | 0 | ||||
-rw-r--r-- | NOTICE | 190 | ||||
-rw-r--r-- | res/values-de-rDE/strings.xml | 10 | ||||
-rw-r--r-- | res/values-en-rGB/strings.xml | 10 | ||||
-rw-r--r-- | res/values-es-rUS/strings.xml | 10 | ||||
-rw-r--r-- | res/values-fr-rFR/strings.xml | 10 | ||||
-rw-r--r-- | res/values-it-rIT/strings.xml | 10 | ||||
-rw-r--r-- | res/values-zh-rTW/strings.xml | 10 | ||||
-rw-r--r-- | res/values/strings.xml | 24 | ||||
-rw-r--r-- | src/com/android/providers/drm/DrmProvider.java | 417 | ||||
-rw-r--r-- | src/com/android/providers/drm/DrmPushReceiver.java | 68 |
13 files changed, 800 insertions, 0 deletions
diff --git a/Android.mk b/Android.mk new file mode 100644 index 0000000..5957334 --- /dev/null +++ b/Android.mk @@ -0,0 +1,13 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := user development + +LOCAL_SRC_FILES := $(call all-subdir-java-files) + +LOCAL_JAVA_LIBRARIES := + +LOCAL_PACKAGE_NAME := DrmProvider +LOCAL_CERTIFICATE := media + +include $(BUILD_PACKAGE) diff --git a/AndroidManifest.xml b/AndroidManifest.xml new file mode 100644 index 0000000..4ce7e53 --- /dev/null +++ b/AndroidManifest.xml @@ -0,0 +1,28 @@ +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.providers.drm" + android:sharedUserId="android.media"> + + <!-- Allows an application to access DRM content --> + <permission android:name="android.permission.ACCESS_DRM" + android:label="@string/permlab_accessDrm" + android:description="@string/permdesc_accessDrm" + android:protectionLevel="signature" /> + + <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" /> + + <application android:process="android.process.media" + android:label="DRM Protected Content Storage"> + + <provider android:name=".DrmProvider" android:authorities="drm" + android:multiprocess="false" /> + + <receiver android:name=".DrmPushReceiver"> + <intent-filter> + <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" /> + <data android:mimeType="application/vnd.oma.drm.rights+xml" /> + <data android:value="application/vnd.oma.drm.rights+wbxml" /> + </intent-filter> + </receiver> + + </application> +</manifest> diff --git a/MODULE_LICENSE_APACHE2 b/MODULE_LICENSE_APACHE2 new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/MODULE_LICENSE_APACHE2 @@ -0,0 +1,190 @@ + + Copyright (c) 2005-2008, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + diff --git a/res/values-de-rDE/strings.xml b/res/values-de-rDE/strings.xml new file mode 100644 index 0000000..4b8daf4 --- /dev/null +++ b/res/values-de-rDE/strings.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="permdesc_accessDrm">Ermöglicht einer Anwendung auf + DRM-geschützte Inhalte zuzugreifen.</string> + <string name="permdesc_queryDrm">Ermöglicht einer Anwendung Inhalte + des DRM-Inhaltanbieters abzufragen.</string> + <string name="permlab_accessDrm">Auf DRM-Inhalte zugreifen.</string> + <string name="permlab_queryDrm">DRM-Inhalte abfragen.</string> +</resources> diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml new file mode 100644 index 0000000..baed421 --- /dev/null +++ b/res/values-en-rGB/strings.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="permdesc_accessDrm">Allows application to access + DRM-protected content.</string> + <string name="permdesc_queryDrm">Allows application to query the + contents of the DRM content provider.</string> + <string name="permlab_accessDrm">Access DRM content.</string> + <string name="permlab_queryDrm">Query DRM content.</string> +</resources> diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml new file mode 100644 index 0000000..c2c0819 --- /dev/null +++ b/res/values-es-rUS/strings.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="permdesc_accessDrm">Permite a la aplicación acceder al + contenido protegido por la DRM.</string> + <string name="permdesc_queryDrm">Permite a la aplicación preguntar sobre el + contenido del proveedor de contenido DRM.</string> + <string name="permlab_accessDrm">Acceder al contenido DRM.</string> + <string name="permlab_queryDrm">Consultar contenido DRM.</string> +</resources> diff --git a/res/values-fr-rFR/strings.xml b/res/values-fr-rFR/strings.xml new file mode 100644 index 0000000..fd5c4de --- /dev/null +++ b/res/values-fr-rFR/strings.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="permdesc_accessDrm">Permet à l\'application d\'accéder + contenu protégé par DRM.</string> + <string name="permdesc_queryDrm">Permet à l\'application d\'interroger le + contenu du fournisseur de contenu DRM.</string> + <string name="permlab_accessDrm">Accédez au contenu DRM.</string> + <string name="permlab_queryDrm">Interrogez le contenu DRM.</string> +</resources> diff --git a/res/values-it-rIT/strings.xml b/res/values-it-rIT/strings.xml new file mode 100644 index 0000000..a1acca5 --- /dev/null +++ b/res/values-it-rIT/strings.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="permdesc_accessDrm">Consente all'applicazione di accedere al contenuto + con protezione DRM.</string> + <string name="permdesc_queryDrm">Consente all'applicazione di interrogare il + contenuto del provider di contenuti DRM.</string> + <string name="permlab_accessDrm">Accedere al contenuto DRM.</string> + <string name="permlab_queryDrm">Interrogare il contenuto DRM.</string> +</resources> diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml new file mode 100644 index 0000000..e8a6e68 --- /dev/null +++ b/res/values-zh-rTW/strings.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="permdesc_accessDrm">允許應用程式存取 + 受到 DRM 保護的內容。</string> + <string name="permdesc_queryDrm">允許應用程式查詢 + DRM 內容提供者的內容。</string> + <string name="permlab_accessDrm">存取 DRM 內容。</string> + <string name="permlab_queryDrm">查詢 DRM 內容。</string> +</resources> diff --git a/res/values/strings.xml b/res/values/strings.xml new file mode 100644 index 0000000..eedece0 --- /dev/null +++ b/res/values/strings.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2008 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + <string name="permlab_accessDrm">Access DRM content.</string> + <string name="permdesc_accessDrm">Allows application to access + DRM-protected content.</string> + <string name="permlab_queryDrm">Query DRM content.</string> + <string name="permdesc_queryDrm">Allows application to query the + contents of the DRM content provider.</string> +</resources> diff --git a/src/com/android/providers/drm/DrmProvider.java b/src/com/android/providers/drm/DrmProvider.java new file mode 100644 index 0000000..aec88b4 --- /dev/null +++ b/src/com/android/providers/drm/DrmProvider.java @@ -0,0 +1,417 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.providers.drm; + +import android.content.*; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteException; +import android.database.sqlite.SQLiteOpenHelper; +import android.database.sqlite.SQLiteQueryBuilder; +import android.database.sqlite.SQLiteStatement; +import android.net.Uri; +import android.os.ParcelFileDescriptor; +import android.provider.DrmStore; +import android.text.TextUtils; +import android.util.Config; +import android.util.Log; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.IOException; +import java.util.HashMap; + +/** + * Drm content provider. See {@link android.provider.DrmStore} for details. + * + * @hide + */ +public class DrmProvider extends ContentProvider +{ + /** + * Creates and updated database on demand when opening it. + * Helper class to create database the first time the provider is + * initialized and upgrade it when a new version of the provider needs + * an updated version of the database. + */ + private final class OpenDatabaseHelper extends SQLiteOpenHelper { + private static final String DATABASE_NAME = "drm.db"; + private static final int DATABASE_VERSION = 1; + + OpenDatabaseHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + /** + * Creates database the first time we try to open it. + */ + @Override + public void onCreate(final SQLiteDatabase db) { + createTables(db); + } + + /** + * Checks data integrity when opening the database + */ + @Override + public void onOpen(final SQLiteDatabase db) { + super.onOpen(db); + // TODO: validate and/or clean up database in onOpen - should that + // be done in the service instead? + } + + /** + * Updates the database format when a new content provider is used + * with an older database format. + */ + // For now, just deletes the database. + // TODO: decide on a general policy when updates become relevant + // TODO: can there even be a downgrade? how can it be handled? + // TODO: delete temporary files + @Override + public void onUpgrade(final SQLiteDatabase db, + final int oldV, final int newV) { + Log.i(TAG, "Upgrading downloads database from version " + + oldV+ " to " + newV + + ", which will destroy all old data"); + dropTables(db); + createTables(db); + } + } + + @Override + public boolean onCreate() + { + mOpenHelper = new OpenDatabaseHelper(getContext()); + return true; + } + + /** + * Creates the table that'll hold the download information. + */ + private void createTables(SQLiteDatabase db) { + db.execSQL("CREATE TABLE audio (" + + "_id INTEGER PRIMARY KEY," + + "_data TEXT," + + "_size INTEGER," + + "title TEXT," + + "mime_type TEXT" + + ");"); + + db.execSQL("CREATE TABLE images (" + + "_id INTEGER PRIMARY KEY," + + "_data TEXT," + + "_size INTEGER," + + "title TEXT," + + "mime_type TEXT" + + ");"); + } + + /** + * Deletes the table that holds the download information. + */ + private void dropTables(SQLiteDatabase db) { + // TODO: error handling + db.execSQL("DROP TABLE IF EXISTS audio"); + db.execSQL("DROP TABLE IF EXISTS images"); + } + + @Override + public Cursor query(Uri uri, String[] projectionIn, String selection, + String[] selectionArgs, String sort) { + String groupBy = null; + + SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); + + switch (URI_MATCHER.match(uri)) { + case AUDIO: + qb.setTables("audio"); + break; + + case AUDIO_ID: + qb.setTables("audio"); + qb.appendWhere("_id=" + uri.getPathSegments().get(1)); + break; + + case IMAGES: + qb.setTables("images"); + break; + + case IMAGES_ID: + qb.setTables("images"); + qb.appendWhere("_id=" + uri.getPathSegments().get(1)); + break; + + default: + throw new IllegalStateException("Unknown URL: " + uri.toString()); + } + + SQLiteDatabase db = mOpenHelper.getReadableDatabase(); + Cursor c = qb.query(db, projectionIn, selection, + selectionArgs, groupBy, null, sort); + if (c != null) { + c.setNotificationUri(getContext().getContentResolver(), uri); + } + return c; + } + + @Override + public String getType(Uri url) + { + switch (URI_MATCHER.match(url)) { + case AUDIO_ID: + case IMAGES_ID: + Cursor c = query(url, MIME_TYPE_PROJECTION, null, null, null); + if (c != null && c.getCount() == 1) { + c.moveToFirst(); + String mimeType = c.getString(1); + c.deactivate(); + return mimeType; + } + break; + } + throw new IllegalStateException("Unknown URL"); + } + + /** + * Ensures there is a file in the _data column of values, if one isn't + * present a new file is created. + * + * @param initialValues the values passed to insert by the caller + * @return the new values + */ + private ContentValues ensureFile(ContentValues initialValues) { + try { + File parent = getContext().getFilesDir(); + parent.mkdirs(); + File file = File.createTempFile("DRM-", ".data", parent); + ContentValues values = new ContentValues(initialValues); + values.put("_data", file.toString()); + return values; + } catch (IOException e) { + Log.e(TAG, "Failed to create data file in ensureFile"); + return null; + } + } + + @Override + public Uri insert(Uri uri, ContentValues initialValues) + { + if (getContext().checkCallingOrSelfPermission(Manifest.permission.ACCESS_DRM) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Requires DRM permission"); + } + + long rowId; + int match = URI_MATCHER.match(uri); + Uri newUri = null; + SQLiteDatabase db = mOpenHelper.getWritableDatabase(); + + if (initialValues == null) { + initialValues = new ContentValues(); + } + + switch (match) { + case AUDIO: { + ContentValues values = ensureFile(initialValues); + if (values == null) return null; + rowId = db.insert("audio", "title", values); + if (rowId > 0) { + newUri = ContentUris.withAppendedId(DrmStore.Audio.CONTENT_URI, rowId); + } + break; + } + + case IMAGES: { + ContentValues values = ensureFile(initialValues); + if (values == null) return null; + rowId = db.insert("images", "title", values); + if (rowId > 0) { + newUri = ContentUris.withAppendedId(DrmStore.Images.CONTENT_URI, rowId); + } + break; + } + + default: + throw new UnsupportedOperationException("Invalid URI " + uri); + } + + if (newUri != null) { + getContext().getContentResolver().notifyChange(uri, null); + } + + return newUri; + } + + private static final class GetTableAndWhereOutParameter { + public String table; + public String where; + } + + static final GetTableAndWhereOutParameter sGetTableAndWhereParam = + new GetTableAndWhereOutParameter(); + + private void getTableAndWhere(Uri uri, int match, String userWhere, + GetTableAndWhereOutParameter out) { + String where = null; + switch (match) { + case AUDIO: + out.table = "audio"; + break; + + case AUDIO_ID: + out.table = "audio"; + where = "_id=" + uri.getPathSegments().get(1); + break; + + case IMAGES: + out.table = "images"; + break; + + case IMAGES_ID: + out.table = "images"; + where = "_id=" + uri.getPathSegments().get(1); + break; + + default: + throw new UnsupportedOperationException( + "Unknown or unsupported URL: " + uri.toString()); + } + + // Add in the user requested WHERE clause, if needed + if (!TextUtils.isEmpty(userWhere)) { + if (!TextUtils.isEmpty(where)) { + out.where = where + " AND (" + userWhere + ")"; + } else { + out.where = userWhere; + } + } else { + out.where = where; + } + } + + private void deleteFiles(Uri uri, String userWhere, String[] whereArgs) { + Cursor c = query(uri, new String [] { "_data" }, userWhere, whereArgs, null); + + try { + if (c != null && c.moveToFirst()) { + String prefix = getContext().getFilesDir().getPath(); + do { + String path = c.getString(0); + if (!path.startsWith(prefix)) { + throw new SecurityException("Attempted to delete a non-DRM file"); + } + new File(path).delete(); + } while (c.moveToNext()); + } + } finally { + if (c != null) { + c.close(); + } + } + } + + @Override + public int delete(Uri uri, String userWhere, String[] whereArgs) { + if (getContext().checkCallingOrSelfPermission(Manifest.permission.ACCESS_DRM) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Requires DRM permission"); + } + + int count; + int match = URI_MATCHER.match(uri); + SQLiteDatabase db = mOpenHelper.getWritableDatabase(); + + synchronized (sGetTableAndWhereParam) { + getTableAndWhere(uri, match, userWhere, sGetTableAndWhereParam); + switch (match) { + default: + deleteFiles(uri, userWhere, whereArgs); + count = db.delete(sGetTableAndWhereParam.table, + sGetTableAndWhereParam.where, whereArgs); + break; + } + } + + return count; + } + + @Override + public int update(Uri uri, ContentValues initialValues, String userWhere, + String[] whereArgs) { + if (getContext().checkCallingOrSelfPermission(Manifest.permission.ACCESS_DRM) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Requires DRM permission"); + } + + int count; + int match = URI_MATCHER.match(uri); + SQLiteDatabase db = mOpenHelper.getWritableDatabase(); + + synchronized (sGetTableAndWhereParam) { + getTableAndWhere(uri, match, userWhere, sGetTableAndWhereParam); + + switch (match) { + default: + count = db.update(sGetTableAndWhereParam.table, initialValues, + sGetTableAndWhereParam.where, whereArgs); + break; + } + } + + return count; + } + + @Override + public ParcelFileDescriptor openFile(Uri uri, String mode) + throws FileNotFoundException { + if (getContext().checkCallingOrSelfPermission(Manifest.permission.ACCESS_DRM) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Requires DRM permission"); + } + return openFileHelper(uri, mode); + } + + private static String TAG = "DrmProvider"; + + private static final int AUDIO = 100; + private static final int AUDIO_ID = 101; + private static final int IMAGES = 102; + private static final int IMAGES_ID = 103; + + private static final UriMatcher URI_MATCHER = + new UriMatcher(UriMatcher.NO_MATCH); + + private static final String[] MIME_TYPE_PROJECTION = new String[] { + DrmStore.Columns._ID, // 0 + DrmStore.Columns.MIME_TYPE, // 1 + }; + + private SQLiteOpenHelper mOpenHelper; + + static + { + URI_MATCHER.addURI(DrmStore.AUTHORITY, "audio", AUDIO); + URI_MATCHER.addURI(DrmStore.AUTHORITY, "audio/#", AUDIO_ID); + URI_MATCHER.addURI(DrmStore.AUTHORITY, "images", IMAGES); + URI_MATCHER.addURI(DrmStore.AUTHORITY, "images/#", IMAGES_ID); + } +} diff --git a/src/com/android/providers/drm/DrmPushReceiver.java b/src/com/android/providers/drm/DrmPushReceiver.java new file mode 100644 index 0000000..abe5ca0 --- /dev/null +++ b/src/com/android/providers/drm/DrmPushReceiver.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.providers.drm; + +import java.io.ByteArrayInputStream; +import java.io.IOException; + +import android.drm.mobile1.DrmException; +import android.drm.mobile1.DrmRights; +import android.drm.mobile1.DrmRightsManager; +import static android.provider.Telephony.Sms.Intents.WAP_PUSH_RECEIVED_ACTION; + +import android.content.Context; +import android.content.Intent; +import android.content.BroadcastReceiver; +import android.util.Log; + +public class DrmPushReceiver extends BroadcastReceiver { + private static final String TAG = "DrmPushReceiver"; + + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(WAP_PUSH_RECEIVED_ACTION)) { + // Get right mimetype. + String rightMimeType = intent.getType(); + if (DrmRightsManager.DRM_MIMETYPE_RIGHTS_XML_STRING.equals(rightMimeType) || + DrmRightsManager.DRM_MIMETYPE_RIGHTS_WBXML_STRING.equals(rightMimeType)) { + // Get right data. + byte[] rightData = (byte[]) intent.getExtra("data"); + if (rightData == null) { + Log.e(TAG, "The rights data is invalid."); + return; + } + ByteArrayInputStream rightDataStream = new ByteArrayInputStream(rightData); + try { + DrmRightsManager.getInstance().installRights(rightDataStream, + rightData.length, + rightMimeType); + } catch (DrmException e) { + Log.e(TAG, "Install drm rights failed."); + return; + } catch (IOException e) { + Log.e(TAG, "IOException occurs when install drm rights."); + return; + } + + Log.d(TAG, "Install drm rights successfully."); + return; + } + Log.d(TAG, "This is not drm rights push mimetype."); + } + Log.d(TAG, "This is not wap push received action."); + } +} |