// Copyright 2019 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.

#include "starboard/shared/starboard/file_atomic_replace_write_file.h"

#include <algorithm>

#include "starboard/common/file.h"
#include "starboard/common/log.h"
#include "starboard/file.h"

namespace starboard {
namespace shared {
namespace starboard {

bool SbFileAtomicReplaceWriteFile(const char* path,
                                  const char* data,
                                  int64_t data_size) {
  SbFileError error;
  SbFile temp_file = SbFileOpen(
      path, kSbFileCreateAlways | kSbFileWrite | kSbFileRead, NULL, &error);

  if (error != kSbFileOk) {
    return false;
  }

  SbFileTruncate(temp_file, 0);

  const char* source = data;
  int64_t to_write = data_size;

  while (to_write > 0) {
    const int to_write_max =
        static_cast<int>(std::min(to_write, static_cast<int64_t>(kSbInt32Max)));
    const int bytes_written = SbFileWrite(temp_file, source, to_write_max);
    RecordFileWriteStat(bytes_written);

    if (bytes_written < 0) {
      SbFileClose(temp_file);
      SbFileDelete(path);
      return false;
    }

    source += bytes_written;
    to_write -= bytes_written;
  }

  SbFileFlush(temp_file);

  if (!SbFileClose(temp_file)) {
    return false;
  }
  return true;
}

}  // namespace starboard
}  // namespace shared
}  // namespace starboard
