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

// An implementation of storage that just uses the filesystem. The User
// implementation must implement a way to get the user's home directory.

#ifndef STARBOARD_SHARED_STARBOARD_FILE_STORAGE_STORAGE_INTERNAL_H_
#define STARBOARD_SHARED_STARBOARD_FILE_STORAGE_STORAGE_INTERNAL_H_

#include "starboard/file.h"
#include "starboard/shared/internal_only.h"
#include "starboard/storage.h"
#include "starboard/string.h"
#include "starboard/user.h"

#if SB_HAS_QUIRK(HASH_FILE_NAME)
#include <ios>
#include <sstream>
#include <string>
#include "starboard/common/murmurhash2.h"
#include "starboard/common/scoped_ptr.h"
#include "starboard/memory.h"
#endif

struct SbStorageRecordPrivate {
  SbUser user;
  SbFile file;
#if SB_API_VERSION >= 6
  std::string name;
#endif  // SB_API_VERSION >= 6
};

namespace starboard {
namespace shared {
namespace starboard {
// Gets the path to the storage file for the given user.
static SB_C_INLINE bool GetUserStorageFilePath(SbUser user,
                                               const char* name,
                                               char* out_path,
                                               int path_size) {
  bool success = SbUserGetProperty(user, kSbUserPropertyHomeDirectory, out_path,
                                   path_size);
  if (!success) {
    return false;
  }

  const size_t n = name ? SbStringGetLength(name) : 0;
  SbStringConcat(out_path, "/.starboard", path_size);
  if (n > 0) {
    SbStringConcat(out_path, ".", path_size);
#if SB_HAS_QUIRK(HASH_FILE_NAME)
    size_t n = SbStringGetLength(name);
    // Two 32 bit hashes will create a 64 bit hash with extremely low
    // probability of collisions. The seed term was chosen arbitrary.
    uint32_t hash1 = MurmurHash2_32(name, n, 0x8df88a67);
    uint32_t hash2 = MurmurHash2_32(name, n, 0x5bdac960);
    std::stringstream name_stringstream;
    name_stringstream << std::hex << hash1 << hash2;
    SbStringConcat(out_path, name_stringstream.str().c_str(), path_size);
#else
    SbStringConcat(out_path, name, path_size);
#endif
  }
  SbStringConcat(out_path, ".storage", path_size);
  return true;
}
}  // namespace starboard
}  // namespace shared
}  // namespace starboard

#endif  // STARBOARD_SHARED_STARBOARD_FILE_STORAGE_STORAGE_INTERNAL_H_
