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

#include "cobalt/xhr/xhr_response_data.h"

#include <algorithm>

#include "cobalt/dom/global_stats.h"

namespace cobalt {
namespace xhr {

namespace {

// When we don't have any data, we still want to return a non-null pointer to a
// valid memory location.  Because even it will never be accessed, a null
// pointer may trigger undefined behavior in functions like memcpy.  So we
// create this dummy value here and return its address when we don't have any
// data.
uint8 s_dummy;

// We are using std::string to store binary data so we want to ensure that char
// occupies one byte.
COMPILE_ASSERT(sizeof(char) == 1, char_should_occupy_one_byte);

}  // namespace

XhrResponseData::XhrResponseData() {
  dom::GlobalStats::GetInstance()->IncreaseXHRMemoryUsage(capacity());
}

XhrResponseData::~XhrResponseData() {
  dom::GlobalStats::GetInstance()->DecreaseXHRMemoryUsage(capacity());
}

void XhrResponseData::Clear() {
  dom::GlobalStats::GetInstance()->DecreaseXHRMemoryUsage(capacity());
  // Use swap to force free the memory allocated.
  std::string dummy;
  data_.swap(dummy);
  dom::GlobalStats::GetInstance()->IncreaseXHRMemoryUsage(capacity());
}

void XhrResponseData::Reserve(size_t new_capacity_bytes) {
  dom::GlobalStats::GetInstance()->DecreaseXHRMemoryUsage(capacity());
  data_.reserve(new_capacity_bytes);
  dom::GlobalStats::GetInstance()->IncreaseXHRMemoryUsage(capacity());
}

void XhrResponseData::Append(const uint8* source_data, size_t size_bytes) {
  if (size_bytes == 0) {
    return;
  }
  dom::GlobalStats::GetInstance()->DecreaseXHRMemoryUsage(capacity());
  data_.resize(data_.size() + size_bytes);
  memcpy(&data_[data_.size() - size_bytes], source_data, size_bytes);
  dom::GlobalStats::GetInstance()->IncreaseXHRMemoryUsage(capacity());
}

const uint8* XhrResponseData::data() const {
  return data_.empty() ? &s_dummy : reinterpret_cast<const uint8*>(&data_[0]);
}

uint8* XhrResponseData::data() {
  return data_.empty() ? &s_dummy : reinterpret_cast<uint8*>(&data_[0]);
}

}  // namespace xhr
}  // namespace cobalt
