blob: c438ac4aa5990215d16abf72cf7f20ef8d62b092 [file] [log] [blame]
/*
* 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 android.provider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.drm.mobile1.DrmRawContent;
import android.drm.mobile1.DrmRights;
import android.drm.mobile1.DrmRightsManager;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.util.Log;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* The DRM provider contains forward locked DRM content.
*
* @hide
*/
public final class DrmStore
{
private static final String TAG = "DrmStore";
public static final String AUTHORITY = "drm";
/**
* This is in the Manifest class of the drm provider, but that isn't visible
* in the framework.
*/
private static final String ACCESS_DRM_PERMISSION = "android.permission.ACCESS_DRM";
/**
* Fields for DRM database
*/
public interface Columns extends BaseColumns {
/**
* The data stream for the file
* <P>Type: DATA STREAM</P>
*/
public static final String DATA = "_data";
/**
* The size of the file in bytes
* <P>Type: INTEGER (long)</P>
*/
public static final String SIZE = "_size";
/**
* The title of the file content
* <P>Type: TEXT</P>
*/
public static final String TITLE = "title";
/**
* The MIME type of the file
* <P>Type: TEXT</P>
*/
public static final String MIME_TYPE = "mime_type";
}
public interface Images extends Columns {
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/images");
}
public interface Audio extends Columns {
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/audio");
}
/**
* Utility function for inserting a file into the DRM content provider.
*
* @param cr The content resolver to use
* @param file The file to insert
* @param title The title for the content (or null)
* @return uri to the DRM record or null
*/
public static final Intent addDrmFile(ContentResolver cr, File file, String title) {
FileInputStream fis = null;
Intent result = null;
try {
fis = new FileInputStream(file);
if (title == null) {
title = file.getName();
int lastDot = title.lastIndexOf('.');
if (lastDot > 0) {
title = title.substring(0, lastDot);
}
}
result = addDrmFile(cr, fis, title);
} catch (Exception e) {
Log.e(TAG, "pushing file failed", e);
} finally {
try {
if (fis != null)
fis.close();
} catch (IOException e) {
Log.e(TAG, "IOException in DrmStore.addDrmFile()", e);
}
}
return result;
}
/**
* Utility function for inserting a file stream into the DRM content provider.
*
* @param cr The content resolver to use
* @param fileStream The FileInputStream to insert
* @param title The title for the content (or null)
* @return uri to the DRM record or null
*/
public static final Intent addDrmFile(ContentResolver cr, FileInputStream fis, String title) {
OutputStream os = null;
Intent result = null;
try {
DrmRawContent content = new DrmRawContent(fis, (int) fis.available(),
DrmRawContent.DRM_MIMETYPE_MESSAGE_STRING);
String mimeType = content.getContentType();
DrmRightsManager manager = manager = DrmRightsManager.getInstance();
DrmRights rights = manager.queryRights(content);
InputStream stream = content.getContentInputStream(rights);
long size = stream.available();
Uri contentUri = null;
if (mimeType.startsWith("audio/")) {
contentUri = DrmStore.Audio.CONTENT_URI;
} else if (mimeType.startsWith("image/")) {
contentUri = DrmStore.Images.CONTENT_URI;
} else {
Log.w(TAG, "unsupported mime type " + mimeType);
}
if (contentUri != null) {
ContentValues values = new ContentValues(3);
values.put(DrmStore.Columns.TITLE, title);
values.put(DrmStore.Columns.SIZE, size);
values.put(DrmStore.Columns.MIME_TYPE, mimeType);
Uri uri = cr.insert(contentUri, values);
if (uri != null) {
os = cr.openOutputStream(uri);
byte[] buffer = new byte[1000];
int count;
while ((count = stream.read(buffer)) != -1) {
os.write(buffer, 0, count);
}
result = new Intent();
result.setDataAndType(uri, mimeType);
}
}
} catch (Exception e) {
Log.e(TAG, "pushing file failed", e);
} finally {
try {
if (fis != null)
fis.close();
if (os != null)
os.close();
} catch (IOException e) {
Log.e(TAG, "IOException in DrmStore.addDrmFile()", e);
}
}
return result;
}
/**
* Utility function to enforce any permissions required to access DRM
* content.
*
* @param context A context used for checking calling permission.
*/
public static void enforceAccessDrmPermission(Context context) {
if (context.checkCallingOrSelfPermission(ACCESS_DRM_PERMISSION) !=
PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("Requires DRM permission");
}
}
}