blob: 3965042eb768caf0396b0c553ee773811760c139 [file] [log] [blame]
// Copyright 2020 The Cobalt Authors. 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.
// Module Overview: Starboard File module
//
// Implements a set of convenience functions and macros built on top of the core
// Starboard file API.
#ifndef STARBOARD_COMMON_FILE_H_
#define STARBOARD_COMMON_FILE_H_
#include "starboard/file.h"
namespace starboard {
void RecordFileWriteStat(int write_file_result);
// Deletes the file, symlink or directory at |path|. When |path| is a directory,
// the function will recursively delete the entire tree; however, when
// |preserve_root| is |true| the root directory is not removed. On some
// platforms, this function fails if a file to be deleted is being held open.
//
// Returns |true| if the file, symlink, or directory was able to be deleted, and
// |false| if there was an error at any point.
//
// |path|: The absolute path of the file, symlink, or directory to be deleted.
// |preserve_root|: Whether or not the root directory should be preserved.
bool SbFileDeleteRecursive(const char* path, bool preserve_root);
// A class that opens an SbFile in its constructor and closes it in its
// destructor, so the file is open for the lifetime of the object. Member
// functions call the corresponding SbFile function.
class ScopedFile {
public:
ScopedFile(const char* path,
int flags,
bool* out_created,
SbFileError* out_error)
: file_(kSbFileInvalid) {
file_ = SbFileOpen(path, flags, out_created, out_error);
}
ScopedFile(const char* path, int flags, bool* out_created)
: file_(kSbFileInvalid) {
file_ = SbFileOpen(path, flags, out_created, NULL);
}
ScopedFile(const char* path, int flags) : file_(kSbFileInvalid) {
file_ = SbFileOpen(path, flags, NULL, NULL);
}
~ScopedFile() { SbFileClose(file_); }
SbFile file() const { return file_; }
bool IsValid() const { return SbFileIsValid(file_); }
int64_t Seek(SbFileWhence whence, int64_t offset) const {
return SbFileSeek(file_, whence, offset);
}
int Read(char* data, int size) const { return SbFileRead(file_, data, size); }
int ReadAll(char* data, int size) const {
return SbFileReadAll(file_, data, size);
}
int Write(const char* data, int size) const {
int result = SbFileWrite(file_, data, size);
RecordFileWriteStat(result);
return result;
}
int WriteAll(const char* data, int size) const {
int result = SbFileWriteAll(file_, data, size);
RecordFileWriteStat(result);
return result;
}
bool Truncate(int64_t length) const { return SbFileTruncate(file_, length); }
bool Flush() const { return SbFileFlush(file_); }
bool GetInfo(SbFileInfo* out_info) const {
return SbFileGetInfo(file_, out_info);
}
int64_t GetSize() const {
SbFileInfo file_info;
bool success = GetInfo(&file_info);
return (success ? file_info.size : -1);
}
// disallow copy and move operations
ScopedFile(const ScopedFile&) = delete;
ScopedFile& operator=(const ScopedFile&) = delete;
private:
SbFile file_;
};
} // namespace starboard
#endif // STARBOARD_COMMON_FILE_H_