/framework/java/jd-gui/android/content/ContentProvider.java

https://bitbucket.org/chaos_rom/miui_frameworks · Java · 520 lines · 460 code · 56 blank · 4 comment · 90 complexity · 9e78bd52ead5f2398b3bdfe2e8ac4b79 MD5 · raw file

  1. package android.content;
  2. import android.content.pm.ComponentInfo;
  3. import android.content.pm.PathPermission;
  4. import android.content.pm.ProviderInfo;
  5. import android.content.res.AssetFileDescriptor;
  6. import android.content.res.Configuration;
  7. import android.database.Cursor;
  8. import android.net.Uri;
  9. import android.os.AsyncTask;
  10. import android.os.Binder;
  11. import android.os.Bundle;
  12. import android.os.CancellationSignal;
  13. import android.os.ICancellationSignal;
  14. import android.os.ParcelFileDescriptor;
  15. import android.os.Process;
  16. import android.os.RemoteException;
  17. import android.util.Log;
  18. import java.io.File;
  19. import java.io.FileDescriptor;
  20. import java.io.FileNotFoundException;
  21. import java.io.IOException;
  22. import java.io.PrintWriter;
  23. import java.util.ArrayList;
  24. import java.util.Iterator;
  25. public abstract class ContentProvider
  26. implements ComponentCallbacks2
  27. {
  28. private static final String TAG = "ContentProvider";
  29. private Context mContext = null;
  30. private boolean mExported;
  31. private int mMyUid;
  32. private PathPermission[] mPathPermissions;
  33. private String mReadPermission;
  34. private Transport mTransport = new Transport();
  35. private String mWritePermission;
  36. public ContentProvider()
  37. {
  38. }
  39. public ContentProvider(Context paramContext, String paramString1, String paramString2, PathPermission[] paramArrayOfPathPermission)
  40. {
  41. this.mContext = paramContext;
  42. this.mReadPermission = paramString1;
  43. this.mWritePermission = paramString2;
  44. this.mPathPermissions = paramArrayOfPathPermission;
  45. }
  46. public static ContentProvider coerceToLocalContentProvider(IContentProvider paramIContentProvider)
  47. {
  48. if ((paramIContentProvider instanceof Transport));
  49. for (ContentProvider localContentProvider = ((Transport)paramIContentProvider).getContentProvider(); ; localContentProvider = null)
  50. return localContentProvider;
  51. }
  52. public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> paramArrayList)
  53. throws OperationApplicationException
  54. {
  55. int i = paramArrayList.size();
  56. ContentProviderResult[] arrayOfContentProviderResult = new ContentProviderResult[i];
  57. for (int j = 0; j < i; j++)
  58. arrayOfContentProviderResult[j] = ((ContentProviderOperation)paramArrayList.get(j)).apply(this, arrayOfContentProviderResult, j);
  59. return arrayOfContentProviderResult;
  60. }
  61. public void attachInfo(Context paramContext, ProviderInfo paramProviderInfo)
  62. {
  63. AsyncTask.init();
  64. if (this.mContext == null)
  65. {
  66. this.mContext = paramContext;
  67. this.mMyUid = Process.myUid();
  68. if (paramProviderInfo != null)
  69. {
  70. setReadPermission(paramProviderInfo.readPermission);
  71. setWritePermission(paramProviderInfo.writePermission);
  72. setPathPermissions(paramProviderInfo.pathPermissions);
  73. this.mExported = paramProviderInfo.exported;
  74. }
  75. onCreate();
  76. }
  77. }
  78. public int bulkInsert(Uri paramUri, ContentValues[] paramArrayOfContentValues)
  79. {
  80. int i = paramArrayOfContentValues.length;
  81. for (int j = 0; j < i; j++)
  82. insert(paramUri, paramArrayOfContentValues[j]);
  83. return i;
  84. }
  85. public Bundle call(String paramString1, String paramString2, Bundle paramBundle)
  86. {
  87. return null;
  88. }
  89. public abstract int delete(Uri paramUri, String paramString, String[] paramArrayOfString);
  90. public void dump(FileDescriptor paramFileDescriptor, PrintWriter paramPrintWriter, String[] paramArrayOfString)
  91. {
  92. paramPrintWriter.println("nothing to dump");
  93. }
  94. public final Context getContext()
  95. {
  96. return this.mContext;
  97. }
  98. public IContentProvider getIContentProvider()
  99. {
  100. return this.mTransport;
  101. }
  102. public final PathPermission[] getPathPermissions()
  103. {
  104. return this.mPathPermissions;
  105. }
  106. public final String getReadPermission()
  107. {
  108. return this.mReadPermission;
  109. }
  110. public String[] getStreamTypes(Uri paramUri, String paramString)
  111. {
  112. return null;
  113. }
  114. public abstract String getType(Uri paramUri);
  115. public final String getWritePermission()
  116. {
  117. return this.mWritePermission;
  118. }
  119. public abstract Uri insert(Uri paramUri, ContentValues paramContentValues);
  120. protected boolean isTemporary()
  121. {
  122. return false;
  123. }
  124. public void onConfigurationChanged(Configuration paramConfiguration)
  125. {
  126. }
  127. public abstract boolean onCreate();
  128. public void onLowMemory()
  129. {
  130. }
  131. public void onTrimMemory(int paramInt)
  132. {
  133. }
  134. public AssetFileDescriptor openAssetFile(Uri paramUri, String paramString)
  135. throws FileNotFoundException
  136. {
  137. ParcelFileDescriptor localParcelFileDescriptor = openFile(paramUri, paramString);
  138. if (localParcelFileDescriptor != null);
  139. for (AssetFileDescriptor localAssetFileDescriptor = new AssetFileDescriptor(localParcelFileDescriptor, 0L, -1L); ; localAssetFileDescriptor = null)
  140. return localAssetFileDescriptor;
  141. }
  142. public ParcelFileDescriptor openFile(Uri paramUri, String paramString)
  143. throws FileNotFoundException
  144. {
  145. throw new FileNotFoundException("No files supported by provider at " + paramUri);
  146. }
  147. protected final ParcelFileDescriptor openFileHelper(Uri paramUri, String paramString)
  148. throws FileNotFoundException
  149. {
  150. int i = 0;
  151. String[] arrayOfString = new String[1];
  152. arrayOfString[i] = "_data";
  153. Cursor localCursor = query(paramUri, arrayOfString, null, null, null);
  154. if (localCursor != null)
  155. i = localCursor.getCount();
  156. if (i != 1)
  157. {
  158. if (localCursor != null)
  159. localCursor.close();
  160. if (i == 0)
  161. throw new FileNotFoundException("No entry for " + paramUri);
  162. throw new FileNotFoundException("Multiple items at " + paramUri);
  163. }
  164. localCursor.moveToFirst();
  165. int j = localCursor.getColumnIndex("_data");
  166. if (j >= 0);
  167. for (String str = localCursor.getString(j); ; str = null)
  168. {
  169. localCursor.close();
  170. if (str != null)
  171. break;
  172. throw new FileNotFoundException("Column _data not found.");
  173. }
  174. int k = ContentResolver.modeToMode(paramUri, paramString);
  175. return ParcelFileDescriptor.open(new File(str), k);
  176. }
  177. public <T> ParcelFileDescriptor openPipeHelper(final Uri paramUri, final String paramString, final Bundle paramBundle, final T paramT, final PipeDataWriter<T> paramPipeDataWriter)
  178. throws FileNotFoundException
  179. {
  180. try
  181. {
  182. final ParcelFileDescriptor[] arrayOfParcelFileDescriptor = ParcelFileDescriptor.createPipe();
  183. new AsyncTask()
  184. {
  185. protected Object doInBackground(Object[] paramAnonymousArrayOfObject)
  186. {
  187. paramPipeDataWriter.writeDataToPipe(arrayOfParcelFileDescriptor[1], paramUri, paramString, paramBundle, paramT);
  188. try
  189. {
  190. arrayOfParcelFileDescriptor[1].close();
  191. return null;
  192. }
  193. catch (IOException localIOException)
  194. {
  195. while (true)
  196. Log.w("ContentProvider", "Failure closing pipe", localIOException);
  197. }
  198. }
  199. }
  200. .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Object[])null);
  201. ParcelFileDescriptor localParcelFileDescriptor = arrayOfParcelFileDescriptor[0];
  202. return localParcelFileDescriptor;
  203. }
  204. catch (IOException localIOException)
  205. {
  206. }
  207. throw new FileNotFoundException("failure making pipe");
  208. }
  209. public AssetFileDescriptor openTypedAssetFile(Uri paramUri, String paramString, Bundle paramBundle)
  210. throws FileNotFoundException
  211. {
  212. if ("*/*".equals(paramString));
  213. for (AssetFileDescriptor localAssetFileDescriptor = openAssetFile(paramUri, "r"); ; localAssetFileDescriptor = openAssetFile(paramUri, "r"))
  214. {
  215. return localAssetFileDescriptor;
  216. String str = getType(paramUri);
  217. if ((str == null) || (!ClipDescription.compareMimeTypes(str, paramString)))
  218. break;
  219. }
  220. throw new FileNotFoundException("Can't open " + paramUri + " as type " + paramString);
  221. }
  222. public abstract Cursor query(Uri paramUri, String[] paramArrayOfString1, String paramString1, String[] paramArrayOfString2, String paramString2);
  223. public Cursor query(Uri paramUri, String[] paramArrayOfString1, String paramString1, String[] paramArrayOfString2, String paramString2, CancellationSignal paramCancellationSignal)
  224. {
  225. return query(paramUri, paramArrayOfString1, paramString1, paramArrayOfString2, paramString2);
  226. }
  227. protected final void setPathPermissions(PathPermission[] paramArrayOfPathPermission)
  228. {
  229. this.mPathPermissions = paramArrayOfPathPermission;
  230. }
  231. protected final void setReadPermission(String paramString)
  232. {
  233. this.mReadPermission = paramString;
  234. }
  235. protected final void setWritePermission(String paramString)
  236. {
  237. this.mWritePermission = paramString;
  238. }
  239. public void shutdown()
  240. {
  241. Log.w("ContentProvider", "implement ContentProvider shutdown() to make sure all database connections are gracefully shutdown");
  242. }
  243. public abstract int update(Uri paramUri, ContentValues paramContentValues, String paramString, String[] paramArrayOfString);
  244. public static abstract interface PipeDataWriter<T>
  245. {
  246. public abstract void writeDataToPipe(ParcelFileDescriptor paramParcelFileDescriptor, Uri paramUri, String paramString, Bundle paramBundle, T paramT);
  247. }
  248. class Transport extends ContentProviderNative
  249. {
  250. Transport()
  251. {
  252. }
  253. private void enforceReadPermission(Uri paramUri)
  254. throws SecurityException
  255. {
  256. Context localContext = ContentProvider.this.getContext();
  257. int i = Binder.getCallingPid();
  258. int j = Binder.getCallingUid();
  259. Object localObject = null;
  260. if (j == ContentProvider.this.mMyUid);
  261. label176: label181:
  262. do
  263. {
  264. int k;
  265. do
  266. {
  267. String str2;
  268. do
  269. {
  270. return;
  271. if (!ContentProvider.this.mExported)
  272. break label181;
  273. str2 = ContentProvider.this.getReadPermission();
  274. if (str2 == null)
  275. break;
  276. }
  277. while (localContext.checkPermission(str2, i, j) == 0);
  278. localObject = str2;
  279. if (str2 == null);
  280. for (k = 1; ; k = 0)
  281. {
  282. PathPermission[] arrayOfPathPermission = ContentProvider.this.getPathPermissions();
  283. if (arrayOfPathPermission == null)
  284. break label176;
  285. String str3 = paramUri.getPath();
  286. int m = arrayOfPathPermission.length;
  287. for (int n = 0; ; n++)
  288. {
  289. if (n >= m)
  290. break label176;
  291. PathPermission localPathPermission = arrayOfPathPermission[n];
  292. String str4 = localPathPermission.getReadPermission();
  293. if ((str4 != null) && (localPathPermission.match(str3)))
  294. {
  295. if (localContext.checkPermission(str4, i, j) == 0)
  296. break;
  297. k = 0;
  298. localObject = str4;
  299. }
  300. }
  301. }
  302. }
  303. while (k != 0);
  304. }
  305. while (localContext.checkUriPermission(paramUri, i, j, 1) == 0);
  306. if (ContentProvider.this.mExported);
  307. for (String str1 = " requires " + localObject + ", or grantUriPermission()"; ; str1 = " requires the provider be exported, or grantUriPermission()")
  308. throw new SecurityException("Permission Denial: reading " + ContentProvider.this.getClass().getName() + " uri " + paramUri + " from pid=" + i + ", uid=" + j + str1);
  309. }
  310. private void enforceWritePermission(Uri paramUri)
  311. throws SecurityException
  312. {
  313. Context localContext = ContentProvider.this.getContext();
  314. int i = Binder.getCallingPid();
  315. int j = Binder.getCallingUid();
  316. Object localObject = null;
  317. if (j == ContentProvider.this.mMyUid);
  318. label176: label181:
  319. do
  320. {
  321. int k;
  322. do
  323. {
  324. String str2;
  325. do
  326. {
  327. return;
  328. if (!ContentProvider.this.mExported)
  329. break label181;
  330. str2 = ContentProvider.this.getWritePermission();
  331. if (str2 == null)
  332. break;
  333. }
  334. while (localContext.checkPermission(str2, i, j) == 0);
  335. localObject = str2;
  336. if (str2 == null);
  337. for (k = 1; ; k = 0)
  338. {
  339. PathPermission[] arrayOfPathPermission = ContentProvider.this.getPathPermissions();
  340. if (arrayOfPathPermission == null)
  341. break label176;
  342. String str3 = paramUri.getPath();
  343. int m = arrayOfPathPermission.length;
  344. for (int n = 0; ; n++)
  345. {
  346. if (n >= m)
  347. break label176;
  348. PathPermission localPathPermission = arrayOfPathPermission[n];
  349. String str4 = localPathPermission.getWritePermission();
  350. if ((str4 != null) && (localPathPermission.match(str3)))
  351. {
  352. if (localContext.checkPermission(str4, i, j) == 0)
  353. break;
  354. k = 0;
  355. localObject = str4;
  356. }
  357. }
  358. }
  359. }
  360. while (k != 0);
  361. }
  362. while (localContext.checkUriPermission(paramUri, i, j, 2) == 0);
  363. if (ContentProvider.this.mExported);
  364. for (String str1 = " requires " + localObject + ", or grantUriPermission()"; ; str1 = " requires the provider be exported, or grantUriPermission()")
  365. throw new SecurityException("Permission Denial: writing " + ContentProvider.this.getClass().getName() + " uri " + paramUri + " from pid=" + i + ", uid=" + j + str1);
  366. }
  367. public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> paramArrayList)
  368. throws OperationApplicationException
  369. {
  370. Iterator localIterator = paramArrayList.iterator();
  371. while (localIterator.hasNext())
  372. {
  373. ContentProviderOperation localContentProviderOperation = (ContentProviderOperation)localIterator.next();
  374. if (localContentProviderOperation.isReadOperation())
  375. enforceReadPermission(localContentProviderOperation.getUri());
  376. if (localContentProviderOperation.isWriteOperation())
  377. enforceWritePermission(localContentProviderOperation.getUri());
  378. }
  379. return ContentProvider.this.applyBatch(paramArrayList);
  380. }
  381. public int bulkInsert(Uri paramUri, ContentValues[] paramArrayOfContentValues)
  382. {
  383. enforceWritePermission(paramUri);
  384. return ContentProvider.this.bulkInsert(paramUri, paramArrayOfContentValues);
  385. }
  386. public Bundle call(String paramString1, String paramString2, Bundle paramBundle)
  387. {
  388. return ContentProvider.this.call(paramString1, paramString2, paramBundle);
  389. }
  390. public ICancellationSignal createCancellationSignal()
  391. throws RemoteException
  392. {
  393. return CancellationSignal.createTransport();
  394. }
  395. public int delete(Uri paramUri, String paramString, String[] paramArrayOfString)
  396. {
  397. enforceWritePermission(paramUri);
  398. return ContentProvider.this.delete(paramUri, paramString, paramArrayOfString);
  399. }
  400. ContentProvider getContentProvider()
  401. {
  402. return ContentProvider.this;
  403. }
  404. public String getProviderName()
  405. {
  406. return getContentProvider().getClass().getName();
  407. }
  408. public String[] getStreamTypes(Uri paramUri, String paramString)
  409. {
  410. return ContentProvider.this.getStreamTypes(paramUri, paramString);
  411. }
  412. public String getType(Uri paramUri)
  413. {
  414. return ContentProvider.this.getType(paramUri);
  415. }
  416. public Uri insert(Uri paramUri, ContentValues paramContentValues)
  417. {
  418. enforceWritePermission(paramUri);
  419. return ContentProvider.this.insert(paramUri, paramContentValues);
  420. }
  421. public AssetFileDescriptor openAssetFile(Uri paramUri, String paramString)
  422. throws FileNotFoundException
  423. {
  424. if ((paramString != null) && (paramString.startsWith("rw")))
  425. enforceWritePermission(paramUri);
  426. while (true)
  427. {
  428. return ContentProvider.this.openAssetFile(paramUri, paramString);
  429. enforceReadPermission(paramUri);
  430. }
  431. }
  432. public ParcelFileDescriptor openFile(Uri paramUri, String paramString)
  433. throws FileNotFoundException
  434. {
  435. if ((paramString != null) && (paramString.startsWith("rw")))
  436. enforceWritePermission(paramUri);
  437. while (true)
  438. {
  439. return ContentProvider.this.openFile(paramUri, paramString);
  440. enforceReadPermission(paramUri);
  441. }
  442. }
  443. public AssetFileDescriptor openTypedAssetFile(Uri paramUri, String paramString, Bundle paramBundle)
  444. throws FileNotFoundException
  445. {
  446. enforceReadPermission(paramUri);
  447. return ContentProvider.this.openTypedAssetFile(paramUri, paramString, paramBundle);
  448. }
  449. public Cursor query(Uri paramUri, String[] paramArrayOfString1, String paramString1, String[] paramArrayOfString2, String paramString2, ICancellationSignal paramICancellationSignal)
  450. {
  451. enforceReadPermission(paramUri);
  452. return ContentProvider.this.query(paramUri, paramArrayOfString1, paramString1, paramArrayOfString2, paramString2, CancellationSignal.fromTransport(paramICancellationSignal));
  453. }
  454. public int update(Uri paramUri, ContentValues paramContentValues, String paramString, String[] paramArrayOfString)
  455. {
  456. enforceWritePermission(paramUri);
  457. return ContentProvider.this.update(paramUri, paramContentValues, paramString, paramArrayOfString);
  458. }
  459. }
  460. }
  461. /* Location: /home/lithium/miui/chameleon/2.11.16/framework_dex2jar.jar
  462. * Qualified Name: android.content.ContentProvider
  463. * JD-Core Version: 0.6.2
  464. */