// Copyright (c) 2015 The Chromium Embedded Framework 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 "libcef/common/resource_bundle_impl.h"

#include "ui/base/resource/resource_bundle.h"

CefResourceBundleImpl::CefResourceBundleImpl() {}

CefString CefResourceBundleImpl::GetLocalizedString(int string_id) {
  if (!ui::ResourceBundle::HasSharedInstance())
    return CefString();

  return ui::ResourceBundle::GetSharedInstance().GetLocalizedString(string_id);
}

bool CefResourceBundleImpl::GetDataResource(int resource_id,
                                            void*& data,
                                            size_t& data_size) {
  return GetDataResourceForScale(resource_id, SCALE_FACTOR_NONE, data,
                                 data_size);
}

bool CefResourceBundleImpl::GetDataResourceForScale(int resource_id,
                                                    ScaleFactor scale_factor,
                                                    void*& data,
                                                    size_t& data_size) {
  if (!ui::ResourceBundle::HasSharedInstance())
    return false;

  const base::StringPiece& result =
      ui::ResourceBundle::GetSharedInstance().GetRawDataResourceForScale(
          resource_id, static_cast<ui::ScaleFactor>(scale_factor));
  if (result.empty())
    return false;

  data = const_cast<char*>(result.data());
  data_size = result.size();
  return true;
}

// static
CefRefPtr<CefResourceBundle> CefResourceBundle::GetGlobal() {
  return new CefResourceBundleImpl();
}
