blob: 1084c968783a8a58661aec314cbe0a9494e6fad5 [file] [log] [blame]
// Copyright 2015 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.
#include "content/child/dwrite_font_proxy/dwrite_localized_strings_win.h"
#include <stddef.h>
#include "base/logging.h"
namespace content {
DWriteLocalizedStrings::DWriteLocalizedStrings() = default;
DWriteLocalizedStrings::~DWriteLocalizedStrings() = default;
HRESULT DWriteLocalizedStrings::FindLocaleName(const WCHAR* locale_name,
UINT32* index,
BOOL* exists) {
for (size_t n = 0; n < strings_.size(); ++n) {
if (_wcsicmp(strings_[n].first.data(), locale_name) == 0) {
*index = n;
*exists = TRUE;
return S_OK;
}
}
*index = UINT_MAX;
*exists = FALSE;
return S_OK;
}
UINT32 DWriteLocalizedStrings::GetCount() {
return strings_.size();
}
HRESULT DWriteLocalizedStrings::GetLocaleName(UINT32 index,
WCHAR* locale_name,
UINT32 size) {
if (index >= strings_.size())
return E_INVALIDARG;
// string16::size does not count the null terminator as part of the string,
// but GetLocaleName requires the caller to reserve space for the null
// terminator, so we need to ensure |size| is greater than the count of
// characters.
if (size <= strings_[index].first.size())
return E_INVALIDARG;
wcsncpy(locale_name, strings_[index].first.c_str(), size);
return S_OK;
}
HRESULT DWriteLocalizedStrings::GetLocaleNameLength(UINT32 index,
UINT32* length) {
if (index >= strings_.size())
return E_INVALIDARG;
// Oddly, GetLocaleNameLength requires the length to not count the null
// terminator, even though GetLocaleName requires the output to be null
// terminated.
*length = strings_[index].first.size();
return S_OK;
}
HRESULT DWriteLocalizedStrings::GetString(UINT32 index,
WCHAR* string_buffer,
UINT32 size) {
if (index >= strings_.size())
return E_INVALIDARG;
// string16::size does not count the null terminator as part of the string,
// but GetString requires the caller to reserve space for the null terminator,
// so we need to ensure |size| is greater than the count of characters.
if (size <= strings_[index].second.size())
return E_INVALIDARG;
wcsncpy(string_buffer, strings_[index].second.c_str(), size);
return S_OK;
}
HRESULT DWriteLocalizedStrings::GetStringLength(UINT32 index, UINT32* length) {
if (index >= strings_.size())
return E_INVALIDARG;
// Oddly, GetStringLength requires the length to not count the null
// terminator, even though GetString requires the output to be null
// terminated.
*length = strings_[index].second.size();
return S_OK;
}
HRESULT DWriteLocalizedStrings::RuntimeClassInitialize(
std::vector<std::pair<base::string16, base::string16>>* strings) {
strings_.swap(*strings);
return S_OK;
}
} // namespace content