Fix a bad interaction with mmap

Bug: 6761221
Change-Id: I7e6d98dc9d7cb34a6163c3957e401ff97abb975c
This commit is contained in:
Jean Chalard 2012-07-04 17:41:55 +09:00
parent 7f7947c97b
commit 4bcf70c931

View file

@ -149,7 +149,8 @@ public class BinaryDictionaryFileDumper {
final int MODE_MAX = NONE; final int MODE_MAX = NONE;
final Uri.Builder wordListUriBuilder = getProviderUriBuilder(id); final Uri.Builder wordListUriBuilder = getProviderUriBuilder(id);
final String outputFileName = BinaryDictionaryGetter.getCacheFileName(id, locale, context); final String finalFileName = BinaryDictionaryGetter.getCacheFileName(id, locale, context);
final String tempFileName = finalFileName + ".tmp";
for (int mode = MODE_MIN; mode <= MODE_MAX; ++mode) { for (int mode = MODE_MIN; mode <= MODE_MAX; ++mode) {
InputStream originalSourceStream = null; InputStream originalSourceStream = null;
@ -165,7 +166,10 @@ public class BinaryDictionaryFileDumper {
if (null == afd) return null; if (null == afd) return null;
originalSourceStream = afd.createInputStream(); originalSourceStream = afd.createInputStream();
// Open output. // Open output.
outputFile = new File(outputFileName); outputFile = new File(tempFileName);
// Just to be sure, delete the file. This may fail silently, and return false: this
// is the right thing to do, as we just want to continue anyway.
outputFile.delete();
outputStream = new FileOutputStream(outputFile); outputStream = new FileOutputStream(outputFile);
// Get the appropriate decryption method for this try // Get the appropriate decryption method for this try
switch (mode) { switch (mode) {
@ -194,14 +198,20 @@ public class BinaryDictionaryFileDumper {
break; break;
} }
checkMagicAndCopyFileTo(new BufferedInputStream(inputStream), outputStream); checkMagicAndCopyFileTo(new BufferedInputStream(inputStream), outputStream);
outputStream.flush();
outputStream.close();
final File finalFile = new File(finalFileName);
if (!outputFile.renameTo(finalFile)) {
throw new IOException("Can't move the file to its final name");
}
wordListUriBuilder.appendQueryParameter(QUERY_PARAMETER_DELETE_RESULT, wordListUriBuilder.appendQueryParameter(QUERY_PARAMETER_DELETE_RESULT,
QUERY_PARAMETER_SUCCESS); QUERY_PARAMETER_SUCCESS);
if (0 >= resolver.delete(wordListUriBuilder.build(), null, null)) { if (0 >= resolver.delete(wordListUriBuilder.build(), null, null)) {
Log.e(TAG, "Could not have the dictionary pack delete a word list"); Log.e(TAG, "Could not have the dictionary pack delete a word list");
} }
BinaryDictionaryGetter.removeFilesWithIdExcept(context, id, outputFile); BinaryDictionaryGetter.removeFilesWithIdExcept(context, id, finalFile);
// Success! Close files (through the finally{} clause) and return. // Success! Close files (through the finally{} clause) and return.
return AssetFileAddress.makeFromFileName(outputFileName); return AssetFileAddress.makeFromFileName(finalFileName);
} catch (Exception e) { } catch (Exception e) {
if (DEBUG) { if (DEBUG) {
Log.i(TAG, "Can't open word list in mode " + mode + " : " + e); Log.i(TAG, "Can't open word list in mode " + mode + " : " + e);