1*ec63e07aSXin Li // Copyright 2022 Google LLC
2*ec63e07aSXin Li //
3*ec63e07aSXin Li // Licensed under the Apache License, Version 2.0 (the "License");
4*ec63e07aSXin Li // you may not use this file except in compliance with the License.
5*ec63e07aSXin Li // You may obtain a copy of the License at
6*ec63e07aSXin Li //
7*ec63e07aSXin Li // https://www.apache.org/licenses/LICENSE-2.0
8*ec63e07aSXin Li //
9*ec63e07aSXin Li // Unless required by applicable law or agreed to in writing, software
10*ec63e07aSXin Li // distributed under the License is distributed on an "AS IS" BASIS,
11*ec63e07aSXin Li // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*ec63e07aSXin Li // See the License for the specific language governing permissions and
13*ec63e07aSXin Li // limitations under the License.
14*ec63e07aSXin Li
15*ec63e07aSXin Li #include "contrib/brotli/utils/utils_brotli.h"
16*ec63e07aSXin Li
GetStreamSize(std::ifstream & stream)17*ec63e07aSXin Li std::streamsize GetStreamSize(std::ifstream& stream) {
18*ec63e07aSXin Li stream.seekg(0, std::ios_base::end);
19*ec63e07aSXin Li std::streamsize ssize = stream.tellg();
20*ec63e07aSXin Li stream.seekg(0, std::ios_base::beg);
21*ec63e07aSXin Li
22*ec63e07aSXin Li return ssize;
23*ec63e07aSXin Li }
24*ec63e07aSXin Li
ReadFile(const std::string & in_file_s)25*ec63e07aSXin Li absl::StatusOr<std::vector<uint8_t>> ReadFile(const std::string& in_file_s) {
26*ec63e07aSXin Li std::ifstream in_file(in_file_s);
27*ec63e07aSXin Li if (!in_file.is_open()) {
28*ec63e07aSXin Li return absl::UnavailableError("File could not be opened");
29*ec63e07aSXin Li }
30*ec63e07aSXin Li
31*ec63e07aSXin Li std::streamsize ssize = GetStreamSize(in_file);
32*ec63e07aSXin Li if (ssize >= kFileMaxSize) {
33*ec63e07aSXin Li return absl::UnavailableError("Incorrect size of file");
34*ec63e07aSXin Li }
35*ec63e07aSXin Li
36*ec63e07aSXin Li std::vector<uint8_t> out_buf(ssize);
37*ec63e07aSXin Li in_file.read(reinterpret_cast<char*>(out_buf.data()), ssize);
38*ec63e07aSXin Li if (ssize != in_file.gcount()) {
39*ec63e07aSXin Li return absl::UnavailableError("Premature end of file");
40*ec63e07aSXin Li }
41*ec63e07aSXin Li if (in_file.fail() || in_file.eof()) {
42*ec63e07aSXin Li return absl::UnavailableError("Error reading file");
43*ec63e07aSXin Li }
44*ec63e07aSXin Li
45*ec63e07aSXin Li return out_buf;
46*ec63e07aSXin Li }
47*ec63e07aSXin Li
WriteFile(const std::string & out_file_s,const std::vector<uint8_t> & out_buf)48*ec63e07aSXin Li absl::Status WriteFile(const std::string& out_file_s,
49*ec63e07aSXin Li const std::vector<uint8_t>& out_buf) {
50*ec63e07aSXin Li std::ofstream out_file(out_file_s);
51*ec63e07aSXin Li if (!out_file.is_open()) {
52*ec63e07aSXin Li return absl::UnavailableError("File could not be opened");
53*ec63e07aSXin Li }
54*ec63e07aSXin Li
55*ec63e07aSXin Li out_file.write(reinterpret_cast<const char*>(out_buf.data()), out_buf.size());
56*ec63e07aSXin Li if (!out_file.good()) {
57*ec63e07aSXin Li return absl::UnavailableError("Error writting file");
58*ec63e07aSXin Li }
59*ec63e07aSXin Li
60*ec63e07aSXin Li return absl::OkStatus();
61*ec63e07aSXin Li }
62