blob: 6495bc43cd5a0eb28f986683886f862861e82de1 [file] [log] [blame]
/*
* 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