package com.boardgamegeek.provider; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.os.ParcelFileDescriptor; import android.text.TextUtils; import com.boardgamegeek.util.FileUtils; import java.io.File; import java.io.FileNotFoundException; public abstract class BaseFileProvider extends BaseProvider { // private static final String TAG = makeLogTag(BaseFileProvider.class); protected abstract String getContentPath(); /** * Generates a file name based on the URI * */ protected abstract String generateFileName(Context context, Uri uri); @Override protected int delete(Context context, SQLiteDatabase db, Uri uri, String selection, String[] selectionArgs) { File file = getFile(context, uri); if (file != null && file.exists()) { boolean deleted = file.delete(); return deleted ? 1 : 0; } return 0; } @Override protected ParcelFileDescriptor openFile(Context context, Uri uri, String mode) throws FileNotFoundException { File file = getFile(context, uri); if (file == null || !file.exists()) { throw new FileNotFoundException("Couldn't get the file at the specified path."); } int parcelMode = calculateParcelMode(uri, mode); return ParcelFileDescriptor.open(file, parcelMode); } /** * Get a {@code File} representing the locally stored results of the URI. * */ private File getFile(Context context, Uri uri) { String fileName = generateFileName(context, uri); if (!TextUtils.isEmpty(fileName)) { return new File(FileUtils.generateContentPath(context, getContentPath()), fileName); } return null; } // from Android ContentResolver.modeToMode private static int calculateParcelMode(Uri uri, String mode) throws FileNotFoundException { if (mode == null) { throw new FileNotFoundException("Missing mode for " + uri); } int modeBits; switch (mode) { case "r": modeBits = ParcelFileDescriptor.MODE_READ_ONLY; break; case "w": case "wt": modeBits = ParcelFileDescriptor.MODE_WRITE_ONLY | ParcelFileDescriptor.MODE_CREATE | ParcelFileDescriptor.MODE_TRUNCATE; break; case "wa": modeBits = ParcelFileDescriptor.MODE_WRITE_ONLY | ParcelFileDescriptor.MODE_CREATE | ParcelFileDescriptor.MODE_APPEND; break; case "rw": modeBits = ParcelFileDescriptor.MODE_READ_WRITE | ParcelFileDescriptor.MODE_CREATE; break; case "rwt": modeBits = ParcelFileDescriptor.MODE_READ_WRITE | ParcelFileDescriptor.MODE_CREATE | ParcelFileDescriptor.MODE_TRUNCATE; break; default: throw new FileNotFoundException("Bad mode for " + uri + ": " + mode); } return modeBits; } }