/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "QuotaResults.h"

#include "ErrorList.h"
#include "mozilla/Assertions.h"
#include "nscore.h"

namespace mozilla::dom::quota {

FullOriginMetadataResult::FullOriginMetadataResult(
    const FullOriginMetadata& aFullOriginMetadata)
    : mFullOriginMetadata(aFullOriginMetadata) {}

NS_IMPL_ISUPPORTS(FullOriginMetadataResult, nsIQuotaFullOriginMetadataResult)

NS_IMETHODIMP
FullOriginMetadataResult::GetSuffix(nsACString& aSuffix) {
  aSuffix = mFullOriginMetadata.mSuffix;
  return NS_OK;
}

NS_IMETHODIMP
FullOriginMetadataResult::GetGroup(nsACString& aGroup) {
  aGroup = mFullOriginMetadata.mGroup;
  return NS_OK;
}

NS_IMETHODIMP
FullOriginMetadataResult::GetOrigin(nsACString& aOrigin) {
  aOrigin = mFullOriginMetadata.mOrigin;
  return NS_OK;
}

NS_IMETHODIMP
FullOriginMetadataResult::GetStorageOrigin(nsACString& aStorageOrigin) {
  aStorageOrigin = mFullOriginMetadata.mStorageOrigin;
  return NS_OK;
}

NS_IMETHODIMP
FullOriginMetadataResult::GetPrivate(bool* aPrivate) {
  MOZ_ASSERT(aPrivate);

  *aPrivate = mFullOriginMetadata.mIsPrivate;
  return NS_OK;
}

NS_IMETHODIMP
FullOriginMetadataResult::GetPersistenceType(nsACString& aPersistenceType) {
  aPersistenceType =
      PersistenceTypeToString(mFullOriginMetadata.mPersistenceType);
  return NS_OK;
}

NS_IMETHODIMP
FullOriginMetadataResult::GetLastAccessTime(int64_t* aLastAccessTime) {
  MOZ_ASSERT(aLastAccessTime);

  *aLastAccessTime = mFullOriginMetadata.mLastAccessTime;
  return NS_OK;
}

NS_IMETHODIMP
FullOriginMetadataResult::GetLastMaintenanceDate(
    int32_t* aLastMaintenanceDate) {
  MOZ_ASSERT(aLastMaintenanceDate);

  *aLastMaintenanceDate = mFullOriginMetadata.mLastMaintenanceDate;
  return NS_OK;
}

NS_IMETHODIMP
FullOriginMetadataResult::GetAccessed(bool* aAccessed) {
  MOZ_ASSERT(aAccessed);

  *aAccessed = mFullOriginMetadata.mAccessed;
  return NS_OK;
}

NS_IMETHODIMP
FullOriginMetadataResult::GetPersisted(bool* aPersisted) {
  MOZ_ASSERT(aPersisted);

  *aPersisted = mFullOriginMetadata.mPersisted;
  return NS_OK;
}

NS_IMETHODIMP
FullOriginMetadataResult::GetClientUsages(nsACString& aClientUsages) {
  mFullOriginMetadata.mClientUsages.Serialize(aClientUsages);
  return NS_OK;
}

NS_IMETHODIMP
FullOriginMetadataResult::GetOriginUsage(uint64_t* aOriginUsage) {
  MOZ_ASSERT(aOriginUsage);

  *aOriginUsage = mFullOriginMetadata.mOriginUsage;
  return NS_OK;
}

NS_IMETHODIMP
FullOriginMetadataResult::GetQuotaVersion(uint32_t* aQuotaVersion) {
  MOZ_ASSERT(aQuotaVersion);

  *aQuotaVersion = mFullOriginMetadata.mQuotaVersion;
  return NS_OK;
}

UsageResult::UsageResult(const nsACString& aOrigin, bool aPersisted,
                         uint64_t aUsage, uint64_t aLastAccessed)
    : mOrigin(aOrigin),
      mUsage(aUsage),
      mPersisted(aPersisted),
      mLastAccessed(aLastAccessed) {}

NS_IMPL_ISUPPORTS(UsageResult, nsIQuotaUsageResult)

NS_IMETHODIMP
UsageResult::GetOrigin(nsACString& aOrigin) {
  aOrigin = mOrigin;
  return NS_OK;
}

NS_IMETHODIMP
UsageResult::GetPersisted(bool* aPersisted) {
  MOZ_ASSERT(aPersisted);

  *aPersisted = mPersisted;
  return NS_OK;
}

NS_IMETHODIMP
UsageResult::GetUsage(uint64_t* aUsage) {
  MOZ_ASSERT(aUsage);

  *aUsage = mUsage;
  return NS_OK;
}

NS_IMETHODIMP
UsageResult::GetLastAccessed(uint64_t* aLastAccessed) {
  MOZ_ASSERT(aLastAccessed);

  *aLastAccessed = mLastAccessed;
  return NS_OK;
}

OriginUsageResult::OriginUsageResult(UsageInfo aUsageInfo)
    : mUsageInfo(aUsageInfo) {}

NS_IMPL_ISUPPORTS(OriginUsageResult, nsIQuotaOriginUsageResult)

NS_IMETHODIMP
OriginUsageResult::GetDatabaseUsage(uint64_t* aDatabaseUsage) {
  MOZ_ASSERT(aDatabaseUsage);

  *aDatabaseUsage = mUsageInfo.DatabaseUsage().valueOr(0);
  return NS_OK;
}

NS_IMETHODIMP
OriginUsageResult::GetFileUsage(uint64_t* aFileUsage) {
  MOZ_ASSERT(aFileUsage);

  *aFileUsage = mUsageInfo.FileUsage().valueOr(0);
  return NS_OK;
}

NS_IMETHODIMP
OriginUsageResult::GetUsage(uint64_t* aUsage) {
  MOZ_ASSERT(aUsage);

  *aUsage = mUsageInfo.TotalUsage().valueOr(0);
  return NS_OK;
}

NS_IMETHODIMP
OriginUsageResult::GetDatabaseUsageIsExplicit(bool* aDatabaseUsageIsExplicit) {
  MOZ_ASSERT(aDatabaseUsageIsExplicit);

  *aDatabaseUsageIsExplicit = mUsageInfo.DatabaseUsage().isSome();
  return NS_OK;
}

NS_IMETHODIMP
OriginUsageResult::GetFileUsageIsExplicit(bool* aFileUsageIsExplicit) {
  MOZ_ASSERT(aFileUsageIsExplicit);

  *aFileUsageIsExplicit = mUsageInfo.FileUsage().isSome();
  return NS_OK;
}

NS_IMETHODIMP
OriginUsageResult::GetTotalUsageIsExplicit(bool* aTotalUsageIsExplicit) {
  MOZ_ASSERT(aTotalUsageIsExplicit);

  *aTotalUsageIsExplicit = mUsageInfo.TotalUsage().isSome();
  return NS_OK;
}

UsageInfo& OriginUsageResult::GetUsageInfo() { return mUsageInfo; }

EstimateResult::EstimateResult(uint64_t aUsage, uint64_t aLimit)
    : mUsage(aUsage), mLimit(aLimit) {}

NS_IMPL_ISUPPORTS(EstimateResult, nsIQuotaEstimateResult)

NS_IMETHODIMP
EstimateResult::GetUsage(uint64_t* aUsage) {
  MOZ_ASSERT(aUsage);

  *aUsage = mUsage;
  return NS_OK;
}

NS_IMETHODIMP
EstimateResult::GetLimit(uint64_t* aLimit) {
  MOZ_ASSERT(aLimit);

  *aLimit = mLimit;
  return NS_OK;
}

}  // namespace mozilla::dom::quota
