AtomicFile.smali 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. .class public Landroid/support/v4/util/AtomicFile;
  2. .super Ljava/lang/Object;
  3. .source "AtomicFile.java"
  4. # instance fields
  5. .field private final mBackupName:Ljava/io/File;
  6. .field private final mBaseName:Ljava/io/File;
  7. # direct methods
  8. .method public constructor <init>(Ljava/io/File;)V
  9. .locals 3
  10. .param p1, "baseName" # Ljava/io/File;
  11. .prologue
  12. .line 51
  13. invoke-direct {p0}, Ljava/lang/Object;-><init>()V
  14. .line 52
  15. iput-object p1, p0, Landroid/support/v4/util/AtomicFile;->mBaseName:Ljava/io/File;
  16. .line 53
  17. new-instance v0, Ljava/io/File;
  18. new-instance v1, Ljava/lang/StringBuilder;
  19. invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
  20. invoke-virtual {p1}, Ljava/io/File;->getPath()Ljava/lang/String;
  21. move-result-object v2
  22. invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
  23. move-result-object v1
  24. const-string v2, ".bak"
  25. invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
  26. move-result-object v1
  27. invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
  28. move-result-object v1
  29. invoke-direct {v0, v1}, Ljava/io/File;-><init>(Ljava/lang/String;)V
  30. iput-object v0, p0, Landroid/support/v4/util/AtomicFile;->mBackupName:Ljava/io/File;
  31. .line 54
  32. return-void
  33. .end method
  34. .method static sync(Ljava/io/FileOutputStream;)Z
  35. .locals 1
  36. .param p0, "stream" # Ljava/io/FileOutputStream;
  37. .prologue
  38. .line 205
  39. if-eqz p0, :cond_0
  40. .line 206
  41. :try_start_0
  42. invoke-virtual {p0}, Ljava/io/FileOutputStream;->getFD()Ljava/io/FileDescriptor;
  43. move-result-object v0
  44. invoke-virtual {v0}, Ljava/io/FileDescriptor;->sync()V
  45. :try_end_0
  46. .catch Ljava/io/IOException; {:try_start_0 .. :try_end_0} :catch_0
  47. .line 208
  48. :cond_0
  49. const/4 v0, 0x1
  50. .line 211
  51. :goto_0
  52. return v0
  53. .line 209
  54. :catch_0
  55. move-exception v0
  56. .line 211
  57. const/4 v0, 0x0
  58. goto :goto_0
  59. .end method
  60. # virtual methods
  61. .method public delete()V
  62. .locals 1
  63. .prologue
  64. .line 68
  65. iget-object v0, p0, Landroid/support/v4/util/AtomicFile;->mBaseName:Ljava/io/File;
  66. invoke-virtual {v0}, Ljava/io/File;->delete()Z
  67. .line 69
  68. iget-object v0, p0, Landroid/support/v4/util/AtomicFile;->mBackupName:Ljava/io/File;
  69. invoke-virtual {v0}, Ljava/io/File;->delete()Z
  70. .line 70
  71. return-void
  72. .end method
  73. .method public failWrite(Ljava/io/FileOutputStream;)V
  74. .locals 3
  75. .param p1, "str" # Ljava/io/FileOutputStream;
  76. .prologue
  77. .line 139
  78. if-eqz p1, :cond_0
  79. .line 140
  80. invoke-static {p1}, Landroid/support/v4/util/AtomicFile;->sync(Ljava/io/FileOutputStream;)Z
  81. .line 142
  82. :try_start_0
  83. invoke-virtual {p1}, Ljava/io/FileOutputStream;->close()V
  84. .line 143
  85. iget-object v1, p0, Landroid/support/v4/util/AtomicFile;->mBaseName:Ljava/io/File;
  86. invoke-virtual {v1}, Ljava/io/File;->delete()Z
  87. .line 144
  88. iget-object v1, p0, Landroid/support/v4/util/AtomicFile;->mBackupName:Ljava/io/File;
  89. iget-object v2, p0, Landroid/support/v4/util/AtomicFile;->mBaseName:Ljava/io/File;
  90. invoke-virtual {v1, v2}, Ljava/io/File;->renameTo(Ljava/io/File;)Z
  91. :try_end_0
  92. .catch Ljava/io/IOException; {:try_start_0 .. :try_end_0} :catch_0
  93. .line 149
  94. :cond_0
  95. :goto_0
  96. return-void
  97. .line 145
  98. :catch_0
  99. move-exception v0
  100. .line 146
  101. .local v0, "e":Ljava/io/IOException;
  102. const-string v1, "AtomicFile"
  103. const-string v2, "failWrite: Got exception:"
  104. invoke-static {v1, v2, v0}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
  105. goto :goto_0
  106. .end method
  107. .method public finishWrite(Ljava/io/FileOutputStream;)V
  108. .locals 3
  109. .param p1, "str" # Ljava/io/FileOutputStream;
  110. .prologue
  111. .line 122
  112. if-eqz p1, :cond_0
  113. .line 123
  114. invoke-static {p1}, Landroid/support/v4/util/AtomicFile;->sync(Ljava/io/FileOutputStream;)Z
  115. .line 125
  116. :try_start_0
  117. invoke-virtual {p1}, Ljava/io/FileOutputStream;->close()V
  118. .line 126
  119. iget-object v1, p0, Landroid/support/v4/util/AtomicFile;->mBackupName:Ljava/io/File;
  120. invoke-virtual {v1}, Ljava/io/File;->delete()Z
  121. :try_end_0
  122. .catch Ljava/io/IOException; {:try_start_0 .. :try_end_0} :catch_0
  123. .line 131
  124. :cond_0
  125. :goto_0
  126. return-void
  127. .line 127
  128. :catch_0
  129. move-exception v0
  130. .line 128
  131. .local v0, "e":Ljava/io/IOException;
  132. const-string v1, "AtomicFile"
  133. const-string v2, "finishWrite: Got exception:"
  134. invoke-static {v1, v2, v0}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
  135. goto :goto_0
  136. .end method
  137. .method public getBaseFile()Ljava/io/File;
  138. .locals 1
  139. .prologue
  140. .line 61
  141. iget-object v0, p0, Landroid/support/v4/util/AtomicFile;->mBaseName:Ljava/io/File;
  142. return-object v0
  143. .end method
  144. .method public openRead()Ljava/io/FileInputStream;
  145. .locals 2
  146. .annotation system Ldalvik/annotation/Throws;
  147. value = {
  148. Ljava/io/FileNotFoundException;
  149. }
  150. .end annotation
  151. .prologue
  152. .line 164
  153. iget-object v0, p0, Landroid/support/v4/util/AtomicFile;->mBackupName:Ljava/io/File;
  154. invoke-virtual {v0}, Ljava/io/File;->exists()Z
  155. move-result v0
  156. if-eqz v0, :cond_0
  157. .line 165
  158. iget-object v0, p0, Landroid/support/v4/util/AtomicFile;->mBaseName:Ljava/io/File;
  159. invoke-virtual {v0}, Ljava/io/File;->delete()Z
  160. .line 166
  161. iget-object v0, p0, Landroid/support/v4/util/AtomicFile;->mBackupName:Ljava/io/File;
  162. iget-object v1, p0, Landroid/support/v4/util/AtomicFile;->mBaseName:Ljava/io/File;
  163. invoke-virtual {v0, v1}, Ljava/io/File;->renameTo(Ljava/io/File;)Z
  164. .line 168
  165. :cond_0
  166. new-instance v0, Ljava/io/FileInputStream;
  167. iget-object v1, p0, Landroid/support/v4/util/AtomicFile;->mBaseName:Ljava/io/File;
  168. invoke-direct {v0, v1}, Ljava/io/FileInputStream;-><init>(Ljava/io/File;)V
  169. return-object v0
  170. .end method
  171. .method public readFully()[B
  172. .locals 8
  173. .annotation system Ldalvik/annotation/Throws;
  174. value = {
  175. Ljava/io/IOException;
  176. }
  177. .end annotation
  178. .prologue
  179. .line 176
  180. invoke-virtual {p0}, Landroid/support/v4/util/AtomicFile;->openRead()Ljava/io/FileInputStream;
  181. move-result-object v5
  182. .line 178
  183. .local v5, "stream":Ljava/io/FileInputStream;
  184. const/4 v4, 0x0
  185. .line 179
  186. .local v4, "pos":I
  187. :try_start_0
  188. invoke-virtual {v5}, Ljava/io/FileInputStream;->available()I
  189. move-result v1
  190. .line 180
  191. .local v1, "avail":I
  192. new-array v2, v1, [B
  193. .line 182
  194. .local v2, "data":[B
  195. :cond_0
  196. :goto_0
  197. array-length v6, v2
  198. sub-int/2addr v6, v4
  199. invoke-virtual {v5, v2, v4, v6}, Ljava/io/FileInputStream;->read([BII)I
  200. :try_end_0
  201. .catchall {:try_start_0 .. :try_end_0} :catchall_0
  202. move-result v0
  203. .line 185
  204. .local v0, "amt":I
  205. if-gtz v0, :cond_1
  206. .line 199
  207. invoke-virtual {v5}, Ljava/io/FileInputStream;->close()V
  208. return-object v2
  209. .line 190
  210. :cond_1
  211. add-int/2addr v4, v0
  212. .line 191
  213. :try_start_1
  214. invoke-virtual {v5}, Ljava/io/FileInputStream;->available()I
  215. move-result v1
  216. .line 192
  217. array-length v6, v2
  218. sub-int/2addr v6, v4
  219. if-le v1, v6, :cond_0
  220. .line 193
  221. add-int v6, v4, v1
  222. new-array v3, v6, [B
  223. .line 194
  224. .local v3, "newData":[B
  225. const/4 v6, 0x0
  226. const/4 v7, 0x0
  227. invoke-static {v2, v6, v3, v7, v4}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
  228. :try_end_1
  229. .catchall {:try_start_1 .. :try_end_1} :catchall_0
  230. .line 195
  231. move-object v2, v3
  232. goto :goto_0
  233. .line 199
  234. .end local v0 # "amt":I
  235. .end local v1 # "avail":I
  236. .end local v2 # "data":[B
  237. .end local v3 # "newData":[B
  238. :catchall_0
  239. move-exception v6
  240. invoke-virtual {v5}, Ljava/io/FileInputStream;->close()V
  241. throw v6
  242. .end method
  243. .method public startWrite()Ljava/io/FileOutputStream;
  244. .locals 7
  245. .annotation system Ldalvik/annotation/Throws;
  246. value = {
  247. Ljava/io/IOException;
  248. }
  249. .end annotation
  250. .prologue
  251. .line 88
  252. iget-object v4, p0, Landroid/support/v4/util/AtomicFile;->mBaseName:Ljava/io/File;
  253. invoke-virtual {v4}, Ljava/io/File;->exists()Z
  254. move-result v4
  255. if-eqz v4, :cond_0
  256. .line 89
  257. iget-object v4, p0, Landroid/support/v4/util/AtomicFile;->mBackupName:Ljava/io/File;
  258. invoke-virtual {v4}, Ljava/io/File;->exists()Z
  259. move-result v4
  260. if-nez v4, :cond_1
  261. .line 90
  262. iget-object v4, p0, Landroid/support/v4/util/AtomicFile;->mBaseName:Ljava/io/File;
  263. iget-object v5, p0, Landroid/support/v4/util/AtomicFile;->mBackupName:Ljava/io/File;
  264. invoke-virtual {v4, v5}, Ljava/io/File;->renameTo(Ljava/io/File;)Z
  265. move-result v4
  266. if-nez v4, :cond_0
  267. .line 91
  268. const-string v4, "AtomicFile"
  269. new-instance v5, Ljava/lang/StringBuilder;
  270. invoke-direct {v5}, Ljava/lang/StringBuilder;-><init>()V
  271. const-string v6, "Couldn\'t rename file "
  272. invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
  273. move-result-object v5
  274. iget-object v6, p0, Landroid/support/v4/util/AtomicFile;->mBaseName:Ljava/io/File;
  275. invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
  276. move-result-object v5
  277. const-string v6, " to backup file "
  278. invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
  279. move-result-object v5
  280. iget-object v6, p0, Landroid/support/v4/util/AtomicFile;->mBackupName:Ljava/io/File;
  281. invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
  282. move-result-object v5
  283. invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
  284. move-result-object v5
  285. invoke-static {v4, v5}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I
  286. .line 98
  287. :cond_0
  288. :goto_0
  289. const/4 v3, 0x0
  290. .line 100
  291. .local v3, "str":Ljava/io/FileOutputStream;
  292. :try_start_0
  293. new-instance v3, Ljava/io/FileOutputStream;
  294. .end local v3 # "str":Ljava/io/FileOutputStream;
  295. iget-object v4, p0, Landroid/support/v4/util/AtomicFile;->mBaseName:Ljava/io/File;
  296. invoke-direct {v3, v4}, Ljava/io/FileOutputStream;-><init>(Ljava/io/File;)V
  297. :try_end_0
  298. .catch Ljava/io/FileNotFoundException; {:try_start_0 .. :try_end_0} :catch_0
  299. .line 112
  300. .restart local v3 # "str":Ljava/io/FileOutputStream;
  301. :goto_1
  302. return-object v3
  303. .line 95
  304. .end local v3 # "str":Ljava/io/FileOutputStream;
  305. :cond_1
  306. iget-object v4, p0, Landroid/support/v4/util/AtomicFile;->mBaseName:Ljava/io/File;
  307. invoke-virtual {v4}, Ljava/io/File;->delete()Z
  308. goto :goto_0
  309. .line 101
  310. :catch_0
  311. move-exception v0
  312. .line 102
  313. .local v0, "e":Ljava/io/FileNotFoundException;
  314. iget-object v4, p0, Landroid/support/v4/util/AtomicFile;->mBaseName:Ljava/io/File;
  315. invoke-virtual {v4}, Ljava/io/File;->getParentFile()Ljava/io/File;
  316. move-result-object v2
  317. .line 103
  318. .local v2, "parent":Ljava/io/File;
  319. invoke-virtual {v2}, Ljava/io/File;->mkdirs()Z
  320. move-result v4
  321. if-nez v4, :cond_2
  322. .line 104
  323. new-instance v4, Ljava/io/IOException;
  324. new-instance v5, Ljava/lang/StringBuilder;
  325. invoke-direct {v5}, Ljava/lang/StringBuilder;-><init>()V
  326. const-string v6, "Couldn\'t create directory "
  327. invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
  328. move-result-object v5
  329. iget-object v6, p0, Landroid/support/v4/util/AtomicFile;->mBaseName:Ljava/io/File;
  330. invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
  331. move-result-object v5
  332. invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
  333. move-result-object v5
  334. invoke-direct {v4, v5}, Ljava/io/IOException;-><init>(Ljava/lang/String;)V
  335. throw v4
  336. .line 107
  337. :cond_2
  338. :try_start_1
  339. new-instance v3, Ljava/io/FileOutputStream;
  340. iget-object v4, p0, Landroid/support/v4/util/AtomicFile;->mBaseName:Ljava/io/File;
  341. invoke-direct {v3, v4}, Ljava/io/FileOutputStream;-><init>(Ljava/io/File;)V
  342. :try_end_1
  343. .catch Ljava/io/FileNotFoundException; {:try_start_1 .. :try_end_1} :catch_1
  344. .restart local v3 # "str":Ljava/io/FileOutputStream;
  345. goto :goto_1
  346. .line 108
  347. .end local v3 # "str":Ljava/io/FileOutputStream;
  348. :catch_1
  349. move-exception v1
  350. .line 109
  351. .local v1, "e2":Ljava/io/FileNotFoundException;
  352. new-instance v4, Ljava/io/IOException;
  353. new-instance v5, Ljava/lang/StringBuilder;
  354. invoke-direct {v5}, Ljava/lang/StringBuilder;-><init>()V
  355. const-string v6, "Couldn\'t create "
  356. invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
  357. move-result-object v5
  358. iget-object v6, p0, Landroid/support/v4/util/AtomicFile;->mBaseName:Ljava/io/File;
  359. invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
  360. move-result-object v5
  361. invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
  362. move-result-object v5
  363. invoke-direct {v4, v5}, Ljava/io/IOException;-><init>(Ljava/lang/String;)V
  364. throw v4
  365. .end method