diff options
author | Haibo Huang <hhb@google.com> | 2018-08-27 13:26:20 -0700 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2018-08-27 13:26:20 -0700 |
commit | 528538d98605d90b2a1c898429554f0ae50f810a (patch) | |
tree | 6b722512d3120a816c9fd6677dcfd83d09dad22b /generator/src/main/java/com/google/archivepatcher/generator/bsdiff/RandomAccessObjectFactory.java | |
parent | 68de7031a8bb372d6dea3a2f40e782e8c157186c (diff) | |
parent | 8b11a458e437c06ef5d51f49e7492c1457d31e62 (diff) | |
download | archive-patcher-528538d98605d90b2a1c898429554f0ae50f810a.tar.gz |
Upgrade archive-patcher to 1.0
am: 8b11a458e4
Change-Id: Ibee6bff6abad106fe5219a68cf788201a0900de4
Diffstat (limited to 'generator/src/main/java/com/google/archivepatcher/generator/bsdiff/RandomAccessObjectFactory.java')
-rw-r--r-- | generator/src/main/java/com/google/archivepatcher/generator/bsdiff/RandomAccessObjectFactory.java | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/generator/src/main/java/com/google/archivepatcher/generator/bsdiff/RandomAccessObjectFactory.java b/generator/src/main/java/com/google/archivepatcher/generator/bsdiff/RandomAccessObjectFactory.java new file mode 100644 index 0000000..24369fa --- /dev/null +++ b/generator/src/main/java/com/google/archivepatcher/generator/bsdiff/RandomAccessObjectFactory.java @@ -0,0 +1,109 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.archivepatcher.generator.bsdiff; + +import com.google.archivepatcher.generator.bsdiff.RandomAccessObject.RandomAccessByteArrayObject; +import com.google.archivepatcher.generator.bsdiff.RandomAccessObject.RandomAccessFileObject; +import com.google.archivepatcher.generator.bsdiff.RandomAccessObject.RandomAccessMmapObject; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; + +/** + * A factory for creating instances of {@link RandomAccessObject}. BsDiff needs to store some + * ancillary data of size proportional to the binary to be patched. This allows abstraction of the + * allocation so that BsDiff can run either entirely in-memory (faster) or with file-backed swap + * (handles bigger inputs without consuming inordinate amounts of memory). + */ +public interface RandomAccessObjectFactory { + public RandomAccessObject create(int size) throws IOException; + + /** + * A factory that produces {@link RandomAccessFileObject} instances backed by temp files. + */ + // TODO(hartmanng): rethink the handling of these temp files. It's confusing and shouldn't + // really be the responsibility of RandomAccessObject. + public static final class RandomAccessFileObjectFactory implements RandomAccessObjectFactory { + private static final String FILE_NAME_PREFIX = "wavsprafof"; + private final String mMode; + + /** + * Factory for a RandomAccessFileObject. + * @param mode the file mode string ("r", "w", "rw", etc - see documentation for + * {@link RandomAccessFile}) + */ + public RandomAccessFileObjectFactory(String mode) { + mMode = mode; + } + + /** + * Creates a temp file, and returns a {@link RandomAccessFile} wrapped in a + * {@link RandomAccessFileObject} representing the new temp file. The temp file does not need to + * explicitly be managed (deleted) by the caller, as long as the caller ensures + * {@link RandomAccessObject#close()} is called when the object is no longer needed. + */ + // TODO(hartmanng): rethink the handling of these temp files. It's confusing and shouldn't + // really be the responsibility of RandomAccessObject. + @Override + public RandomAccessObject create(int size) throws IOException { + return new RandomAccessObject.RandomAccessFileObject( + File.createTempFile(FILE_NAME_PREFIX, "temp"), mMode, true); + } + } + + /** + * A factory that produces {@link RandomAccessByteArrayObject} instances backed by memory. + */ + public static final class RandomAccessByteArrayObjectFactory + implements RandomAccessObjectFactory { + @Override + public RandomAccessObject create(int size) { + return new RandomAccessObject.RandomAccessByteArrayObject(size); + } + } + + /** + * A factory that produces {@link RandomAccessMmapObject} instances backed by temp files.. + */ + // TODO(hartmanng): rethink the handling of these temp files. It's confusing and shouldn't + // really be the responsibility of RandomAccessObject. + public static final class RandomAccessMmapObjectFactory implements RandomAccessObjectFactory { + private static final String FILE_NAME_PREFIX = "wavsprafof"; + private String mMode; + + /** + * Factory for a RandomAccessMmapObject. + * @param mode the file mode string ("r", "w", "rw", etc - see documentation for + * {@link RandomAccessFile}) + */ + public RandomAccessMmapObjectFactory(String mode) { + mMode = mode; + } + + /** + * Creates a temp file, and returns a {@link RandomAccessFile} wrapped in a + * {@link RandomAccessMmapObject} representing the new temp file. The temp file does not need to + * explicitly be managed (deleted) by the caller, as long as the caller ensures + * {@link RandomAccessObject#close()} is called when the object is no longer needed. + */ + // TODO(hartmanng): rethink the handling of these temp files. It's confusing and shouldn't + // really be the responsibility of RandomAccessObject. + @Override + public RandomAccessObject create(int size) throws IOException { + return new RandomAccessObject.RandomAccessMmapObject(FILE_NAME_PREFIX, mMode, size); + } + } +} |