// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_SNAPSHOTS_MODEL_SNAPSHOT_STORAGE_WRAPPER_H_
#define IOS_CHROME_BROWSER_SNAPSHOTS_MODEL_SNAPSHOT_STORAGE_WRAPPER_H_
#import <UIKit/UIKit.h>
#include <vector>
class SnapshotID;
namespace base {
class FilePath;
class Time;
} // namespace base
@protocol SnapshotStorageObserver;
@class SnapshotStorage;
// The wrapper class for LegacySnapshotStorage and SnapshotStorage.
// The APIs are exactly the same as LegacySnapshotStorage and the new
// implementation written in Swift is used when the flag (kSnapshotInSwift) is
// enabled.
// TODO(crbug.com/40943236): Remove this class once the new implementation
// written in Swift is used by default.
@interface SnapshotStorageWrapper : NSObject
@property(readonly) SnapshotStorage* snapshotStorage;
// Designated initializer. `storagePath` is the file path where all images
// managed by this LegacySnapshotStorage are stored. `storagePath` is not
// guaranteed to exist. The contents of `storagePath` are entirely managed by
// this LegacySnapshotStorage.
//
// To support renaming the directory where the snapshots are stored, it is
// possible to pass a non-empty path via `legacyPath`. If present, then it
// will be moved to `storagePath`.
//
// TODO(crbug.com/40942167): Remove when the storage for all users has been
// migrated.
- (instancetype)initWithStoragePath:(const base::FilePath&)storagePath
legacyPath:(const base::FilePath&)legacyPath
NS_DESIGNATED_INITIALIZER;
// Convenience initializer that pass an empty `legacyPath`.
- (instancetype)initWithStoragePath:(const base::FilePath&)storagePath;
- (instancetype)init NS_UNAVAILABLE;
// Retrieves a cached snapshot for the `snapshotID` and return it via the
// callback if it exists. The callback is guaranteed to be called synchronously
// if the image is in memory. It will be called asynchronously if the image is
// on disk or with nil if the image is not present at all.
- (void)retrieveImageForSnapshotID:(SnapshotID)snapshotID
callback:(void (^)(UIImage*))callback;
// Requests the grey snapshot for `snapshotID`. If the image is already loaded
// in memory, this will immediately call back with `callback`.
- (void)retrieveGreyImageForSnapshotID:(SnapshotID)snapshotID
callback:(void (^)(UIImage*))callback;
// Sets the image in both the LRU and disk.
- (void)setImage:(UIImage*)image withSnapshotID:(SnapshotID)snapshotID;
// Removes the image from both the LRU and disk.
- (void)removeImageWithSnapshotID:(SnapshotID)snapshotID;
// Removes all images from both the LRU and disk.
- (void)removeAllImages;
// Purges the storage of snapshots that are older than `date`. The snapshots for
// `liveSnapshotIDs` will be kept. This will be done asynchronously on a
// background thread.
- (void)purgeImagesOlderThan:(base::Time)date
keeping:(const std::vector<SnapshotID>&)liveSnapshotIDs;
// Renames snapshots with names in `oldIDs` to names in `newIDs`. It is a
// programmatic error if the two array do not have the same length.
- (void)renameSnapshotsWithIDs:(NSArray<NSString*>*)oldIDs
toIDs:(const std::vector<SnapshotID>&)newIDs;
// Moves the on-disk tab snapshot from the receiver storage to the destination
// on-disk storage. If the snapshot was also in-memory, it is moved as well.
- (void)migrateImageWithSnapshotID:(SnapshotID)snapshotID
toSnapshotStorage:(SnapshotStorageWrapper*)destinationCache;
// Adds an observer to this snapshot storage.
- (void)addObserver:(id<SnapshotStorageObserver>)observer;
// Removes an observer from this snapshot storage.
- (void)removeObserver:(id<SnapshotStorageObserver>)observer;
// Must be invoked before the instance is deallocated. It is needed to release
// all references to C++ objects. The receiver will likely soon be deallocated.
- (void)shutdown;
@end
#endif // IOS_CHROME_BROWSER_SNAPSHOTS_MODEL_SNAPSHOT_STORAGE_WRAPPER_H_