/*
 * Copyright 2015 Google Inc. 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.
 */

#ifndef COBALT_STORAGE_VIRTUAL_FILE_H_
#define COBALT_STORAGE_VIRTUAL_FILE_H_

#include <string>
#include <vector>

#include "base/basictypes.h"
#include "base/compiler_specific.h"

namespace cobalt {
namespace storage {
class VirtualFileSystem;

// VirtualFile implements an in-memory file system. These
// are managed by VirtualFileSystem for use by SQLite3.
// The format of a serialized VirtualFile is as follows:
// 8-byte name length
// <name length> File name string
// 8-byte file size
// <file size> raw bytes.
class VirtualFile {
 public:
  enum { kMaxVfsPathname = 512 };

  int Read(void* dest, int bytes, int offset) const;
  int Write(const void* source, int bytes, int offset);
  int Truncate(int size);
  int Size() const { return static_cast<int>(buffer_.size()); }

 private:
  explicit VirtualFile(const std::string& name);
  ~VirtualFile();

  // Returns the number of bytes written
  int Serialize(uint8* dest, const bool dry_run);
  // Deserializes a file, returning the size of the file or
  // < 0 on error.
  // |buffer_remaining| is the maximum size of |source|
  int Deserialize(const uint8* source, size_t buffer_remaining);

  std::vector<uint8> buffer_;

  std::string name_;

  friend class VirtualFileSystem;
  DISALLOW_COPY_AND_ASSIGN(VirtualFile);
};

}  // namespace storage
}  // namespace cobalt

#endif  // COBALT_STORAGE_VIRTUAL_FILE_H_
