That fuck shit the fascists are using
1package org.tm.archive.providers;
2
3import android.content.ContentValues;
4import android.database.Cursor;
5import android.net.Uri;
6import android.os.MemoryFile;
7import android.os.ParcelFileDescriptor;
8
9import androidx.annotation.NonNull;
10import androidx.annotation.Nullable;
11
12import org.signal.core.util.StreamUtil;
13import org.signal.core.util.logging.Log;
14import org.tm.archive.dependencies.ApplicationDependencies;
15import org.tm.archive.util.MemoryFileUtil;
16import org.tm.archive.util.Util;
17
18import java.io.FileNotFoundException;
19import java.io.IOException;
20import java.io.InputStream;
21import java.io.OutputStream;
22
23public final class BlobContentProvider extends BaseContentProvider {
24
25 private static final String TAG = Log.tag(BlobContentProvider.class);
26
27 @Override
28 public boolean onCreate() {
29 Log.i(TAG, "onCreate()");
30 return true;
31 }
32
33 @Override
34 public ParcelFileDescriptor openFile(@NonNull Uri uri, @NonNull String mode) throws FileNotFoundException {
35 Log.i(TAG, "openFile() called: " + uri);
36
37 try {
38 try (InputStream stream = BlobProvider.getInstance().getStream(ApplicationDependencies.getApplication(), uri)) {
39 Long fileSize = BlobProvider.getFileSize(uri);
40 if (fileSize == null) {
41 Log.w(TAG, "No file size available");
42 throw new FileNotFoundException();
43 }
44
45 return getParcelStreamForStream(stream, Util.toIntExact(fileSize));
46 }
47 } catch (IOException e) {
48 throw new FileNotFoundException();
49 }
50 }
51
52 private static @NonNull ParcelFileDescriptor getParcelStreamForStream(@NonNull InputStream in, int fileSize) throws IOException {
53 MemoryFile memoryFile = new MemoryFile(null, fileSize);
54
55 try (OutputStream out = memoryFile.getOutputStream()) {
56 StreamUtil.copy(in, out);
57 }
58
59 return MemoryFileUtil.getParcelFileDescriptor(memoryFile);
60 }
61
62 @Nullable
63 @Override
64 public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
65 Log.i(TAG, "query() called: " + uri);
66
67 String mimeType = BlobProvider.getMimeType(uri);
68 String fileName = BlobProvider.getFileName(uri);
69 Long fileSize = BlobProvider.getFileSize(uri);
70
71 if (fileSize == null) {
72 Log.w(TAG, "No file size");
73 return null;
74 }
75
76 if (mimeType == null) {
77 Log.w(TAG, "No mime type");
78 return null;
79 }
80
81 if (fileName == null) {
82 fileName = createFileNameForMimeType(mimeType);
83 }
84
85 return createCursor(projection, fileName, fileSize);
86 }
87
88 @Nullable
89 @Override
90 public String getType(@NonNull Uri uri) {
91 return BlobProvider.getMimeType(uri);
92 }
93
94 @Nullable
95 @Override
96 public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
97 return null;
98 }
99
100 @Override
101 public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
102 return 0;
103 }
104
105 @Override
106 public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
107 return 0;
108 }
109}