// Copyright 2023 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_SESSIONS_MODEL_SESSION_INTERNAL_UTIL_H_
#define IOS_CHROME_BROWSER_SESSIONS_MODEL_SESSION_INTERNAL_UTIL_H_
#import <Foundation/Foundation.h>
@class SessionWindowIOS;
namespace base {
class FilePath;
} // namespace base
namespace google::protobuf {
class MessageLite;
} // namespace google::protobuf
namespace ios::sessions {
// Returns whether a file named `filename` exists.
[[nodiscard]] bool FileExists(const base::FilePath& filename);
// Returns whether a directory named `dirname` exists.
[[nodiscard]] bool DirectoryExists(const base::FilePath& dirname);
// Renames a file from `from` to `dest`.
[[nodiscard]] bool RenameFile(const base::FilePath& from,
const base::FilePath& dest);
// Creates `directory` including all intermediate directories and returns
// whether the operation was a success. Safe to call if `directory` exists.
[[nodiscard]] bool CreateDirectory(const base::FilePath& directory);
// Returns whether `directory` exists and is empty.
[[nodiscard]] bool DirectoryEmpty(const base::FilePath& directory);
// Deletes recursively file or directory at `path`. Returns whether the
// operation was a success.
[[nodiscard]] bool DeleteRecursively(const base::FilePath& path);
// Copies content of `from_dir` to `dest_dir` recursively. It is an error
// if `from_dir` is not an existing directory or if `dest_dir` exists and
// is not a directory.
[[nodiscard]] bool CopyDirectory(const base::FilePath& from_dir,
const base::FilePath& dest_dir);
// Copies file at `from_path` to `dest_path`. It is an error if `from_path`
// is not a file or if `dest_path` exists and is not a file.
[[nodiscard]] bool CopyFile(const base::FilePath& from_path,
const base::FilePath& dest_path);
// Writes `data` to `filename` and returns whether the operation was a success.
// The file is created with protection until first user authentication.
[[nodiscard]] bool WriteFile(const base::FilePath& filename, NSData* data);
// Reads content of `filename` and returns it as a `NSData*` or nil on error.
[[nodiscard]] NSData* ReadFile(const base::FilePath& filename);
// Writes `proto` to `filename` and returns whether the operation was a success.
// The file is created with protection until first user authentication.
[[nodiscard]] bool WriteProto(const base::FilePath& filename,
const google::protobuf::MessageLite& proto);
// Parses content of `filename` into `proto` and return whether the operation
// was a success.
[[nodiscard]] bool ParseProto(const base::FilePath& filename,
google::protobuf::MessageLite& proto);
// Encodes `object` into binary data. On error, returns nil.
[[nodiscard]] NSData* ArchiveRootObject(NSObject<NSCoding>* object);
// Decodes root object from `data`. On error, returns nil.
[[nodiscard]] NSObject<NSCoding>* DecodeRootObject(NSData* data);
// Loads session from `filename`. On error, returns nil.
[[nodiscard]] SessionWindowIOS* ReadSessionWindow(
const base::FilePath& filename);
// Writes `session` to `filename`. On error, returns false.
[[nodiscard]] bool WriteSessionWindow(const base::FilePath& filename,
SessionWindowIOS* session);
} // namespace ios::sessions
#endif // IOS_CHROME_BROWSER_SESSIONS_MODEL_SESSION_INTERNAL_UTIL_H_