/* * Copyright (C) 2019 The Android Open Source Project * * 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 specic language governing permissions and * limitations under the License. */ #ifndef MEDIA_PROVIDER_FUSE_REDACTIONINFO_H_ #define MEDIA_PROVIDER_FUSE_REDACTIONINFO_H_ #include #include namespace mediaprovider { namespace fuse { /** * Type that represents a single redaction range within a file. Contains * a pair of offsets in the file, [start, end). */ typedef std::pair RedactionRange; class ReadRange { public: ReadRange(off64_t s, size_t l, bool r) : start(s), size(l), is_redaction(r) {} const off64_t start; const size_t size; const bool is_redaction; bool operator==(const ReadRange& rhs) const { return start == rhs.start && size == rhs.size && is_redaction == rhs.is_redaction; } }; class RedactionInfo { public: /** * Constructs a new instance of RedactionInfo based on the given redaction * ranges. * * @param redaction_ranges_num number of redaction ranges, essentially HALF * the size of the array redaction_ranges. If there are no redaction ranges, * this value must be set to 0. * * @param redaction_ranges array that defines the redaction ranges in * the following way: * redaction ranges n = [ redaction_ranges[2n], redaction_ranges[2n+1]] * This means that this array's length should be TWICE the value of * redaction_ranges_num */ RedactionInfo(int redaction_ranges_num, const off64_t* redaction_ranges); /** * Constructs a new instance of RedactionInfo with no redaction ranges. */ RedactionInfo() = default; /** * Calls d'tor for redactionRanges (vector). */ ~RedactionInfo() = default; /** * Returns a set of ranges to fulfill a read request starting at |off| of size * |size|. */ void getReadRanges(off64_t off, size_t size, std::vector* out) const; /** * Returns whether any ranges need to be redacted. */ bool isRedactionNeeded() const; /** * Returns number of redaction ranges. */ int size() const; private: /** * Calculates the redaction ranges that overlap with a given read request. * The read request is defined by its size and the offset of its first byte. * *

The returned ranges are guaranteed to be: * * Non-overlapping (with each other) * * Sorted in an ascending order of offset * * @param size size of the read request * @param off offset of the first byte of the read request * @return unique_ptr to a vector of RedactionRanges. If there are no * relevant redaction ranges, the vector will be empty. */ std::unique_ptr> getOverlappingRedactionRanges(size_t size, off64_t off) const; std::vector redaction_ranges_; void processRedactionRanges(int redaction_ranges_num, const off64_t* redaction_ranges); bool hasOverlapWithReadRequest(size_t size, off64_t off) const; }; } // namespace fuse } // namespace mediaprovider #endif // MEDIA_PROVIDER_FUSE_REDACTIONINFO_H_