// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef NET_DISK_CACHE_SIMPLE_SIMPLE_UTIL_H_
#define NET_DISK_CACHE_SIMPLE_SIMPLE_UTIL_H_

#include <string>

#include "base/strings/string_piece.h"
#include "net/base/net_export.h"
#include "net/disk_cache/simple/simple_file_tracker.h"
#include "starboard/types.h"

namespace base {
class FilePath;
class Time;
}

namespace disk_cache {

namespace simple_util {

NET_EXPORT_PRIVATE std::string ConvertEntryHashKeyToHexString(
    uint64_t hash_key);

// |key| is the regular cache key, such as an URL.
// Returns the Hex ascii representation of the uint64_t hash_key.
NET_EXPORT_PRIVATE std::string GetEntryHashKeyAsHexString(
    const std::string& key);

// |key| is the regular HTTP Cache key, which is a URL.
// Returns the hash of the key as uint64_t.
NET_EXPORT_PRIVATE uint64_t GetEntryHashKey(const std::string& key);

// Parses the |hash_key| string into a uint64_t buffer.
// |hash_key| string must be of the form: FFFFFFFFFFFFFFFF .
NET_EXPORT_PRIVATE bool GetEntryHashKeyFromHexString(
    const base::StringPiece& hash_key,
    uint64_t* hash_key_out);

// Given a |key| for a (potential) entry in the simple backend and the |index|
// of a stream on that entry, returns the filename in which that stream would be
// stored.
NET_EXPORT_PRIVATE std::string GetFilenameFromKeyAndFileIndex(
    const std::string& key,
    int file_index);

// Same as |GetFilenameFromKeyAndIndex| above, but using a numeric key.
NET_EXPORT_PRIVATE std::string GetFilenameFromEntryFileKeyAndFileIndex(
    const SimpleFileTracker::EntryFileKey& key,
    int file_index);

// Given a |key| for an entry, returns the name of the sparse data file.
NET_EXPORT_PRIVATE std::string GetSparseFilenameFromEntryFileKey(
    const SimpleFileTracker::EntryFileKey& key);

// Given the size of a key, the size in bytes of the header at the beginning
// of a simple cache file.
size_t GetHeaderSize(size_t key_length);

// Given the size of a file holding a stream in the simple backend and the key
// to an entry, returns the number of bytes in the stream.
NET_EXPORT_PRIVATE int32_t GetDataSizeFromFileSize(size_t key_length,
                                                   int64_t file_size);

// Given the size of a stream in the simple backend and the key to an entry,
// returns the number of bytes in the file.
NET_EXPORT_PRIVATE int64_t GetFileSizeFromDataSize(size_t key_length,
                                                   int32_t data_size);

// Given the stream index, returns the number of the file the stream is stored
// in.
NET_EXPORT_PRIVATE int GetFileIndexFromStreamIndex(int stream_index);

// Fills |out_time| with the time the file last modified time. Unlike the
// functions in file.h, the time resolution is milliseconds.
NET_EXPORT_PRIVATE bool GetMTime(const base::FilePath& path,
                                 base::Time* out_mtime);

// Deletes a file, insuring POSIX semantics. Provided that all open handles to
// this file were opened with File::FLAG_SHARE_DELETE, it is possible to delete
// an open file and continue to use that file. After deleting an open file, it
// is possible to immediately create a new file with the same name.
NET_EXPORT_PRIVATE bool SimpleCacheDeleteFile(const base::FilePath& path);

uint32_t Crc32(const char* data, int length);

uint32_t IncrementalCrc32(uint32_t previous_crc, const char* data, int length);

}  // namespace simple_util

}  // namespace disk_cache

#endif  // NET_DISK_CACHE_SIMPLE_SIMPLE_UTIL_H_
