| // Copyright 2015 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef FIDES_BLOB_STORE_H_ |
| #define FIDES_BLOB_STORE_H_ |
| |
| #include <stdint.h> |
| |
| #include <string> |
| #include <vector> |
| |
| #include <base/macros.h> |
| |
| #include "fides/blob_ref.h" |
| |
| namespace fides { |
| |
| // A class that loads and stores Blobs. |
| class BlobStore { |
| public: |
| class Handle { |
| public: |
| Handle(); |
| bool IsValid() const; |
| |
| private: |
| Handle(unsigned int blob_id, const std::string& source_id); |
| |
| // 0 is considered to be an invalid blob id. |
| unsigned int blob_id_; |
| std::string source_id_; |
| |
| friend class BlobStore; |
| friend class SettingsDocumentManagerTest; |
| }; |
| |
| public: |
| // |storage_path| needs to point to a directory that the system user running |
| // fidesd has write access to. If the directory does not already exist, it |
| // will be created on the first invocation of the Store() method. |
| explicit BlobStore(const std::string& storage_path); |
| |
| // Stores the |blob| originating from the source identified by |source_id| on |
| // the disk. |
| Handle Store(const std::string& source_id, const BlobRef blob) const; |
| |
| // Loads the blob identified by |handle| from disk. |
| const std::vector<uint8_t> Load(Handle handle) const; |
| |
| // Returns the list of handles to all documents provided by the source |
| // identified by |source_id| in increasing order of blob id. |
| std::vector<Handle> List(const std::string& source_id) const; |
| |
| // Deletes the blob identified by |handle| from disk. Returns true on success. |
| // Otherwise, returns false. Note that passing an invalid handle is considered |
| // an error. |
| bool Purge(Handle handle) const; |
| |
| private: |
| // Path to the root of the directory hierarchy to store blobs in. |
| const std::string storage_path_; |
| |
| // Constructs the path for blob with id |blob_id| for |source_id|. If either |
| // |blob_id| or |source_id| are invalid (see implementation for comments), |
| // this method fails and returns the empty string. |
| std::string GetBlobPath(unsigned int blob_id, |
| const std::string& source_id) const; |
| |
| // Constructs the path containing the blobs for |source_id|. If |source_id| is |
| // invalid (see implementation for comments), this method fails and returns |
| // the empty string. |
| std::string GetSourcePath(const std::string& source_id) const; |
| |
| // Attempts to extract the blob id from the filename. If |filename| does not |
| // follow the naming scheme (see implementation for comments), this method |
| // fails and returns 0. |
| unsigned int FilenameToBlobId(const std::string& filename) const; |
| |
| // Returns the next unused blob id for |source_id|. Note that this function is |
| // not safe against race conditions in cases where another process is trying |
| // to find the next unused identifier as well. |
| unsigned int GetNextUnusedBlobId(const std::string& source_id) const; |
| |
| DISALLOW_COPY_AND_ASSIGN(BlobStore); |
| }; |
| |
| } // namespace fides |
| |
| #endif // FIDES_BLOB_STORE_H_ |