policy_error_map.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/browser/policy_error_map.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "grit/component_strings.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PolicyErrorMap::PendingError {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PendingError(const std::string& policy,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const std::string& subkey,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               int index,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               int message_id,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const std::string& replacement)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : policy(policy),
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        subkey(subkey),
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        index(index),
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message_id(message_id),
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        has_replacement(true),
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        replacement(replacement) {}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PendingError(const std::string& policy,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const std::string& subkey,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               int index,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               int message_id)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : policy(policy),
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        subkey(subkey),
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        index(index),
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message_id(message_id),
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        has_replacement(false) {}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string policy;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string subkey;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int message_id;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_replacement;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PolicyErrorMap::PolicyErrorMap() {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PolicyErrorMap::~PolicyErrorMap() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PolicyErrorMap::IsReady() const {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::ResourceBundle::HasSharedInstance();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PolicyErrorMap::AddError(const std::string& policy, int message_id) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddError(PendingError(policy, std::string(), -1, message_id));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PolicyErrorMap::AddError(const std::string& policy,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::string& subkey,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int message_id) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddError(PendingError(policy, subkey, -1, message_id));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PolicyErrorMap::AddError(const std::string& policy,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int index,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int message_id) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddError(PendingError(policy, std::string(), index, message_id));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PolicyErrorMap::AddError(const std::string& policy,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int message_id,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::string& replacement) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddError(PendingError(policy, std::string(), -1, message_id, replacement));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PolicyErrorMap::AddError(const std::string& policy,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::string& subkey,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int message_id,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::string& replacement) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddError(PendingError(policy, subkey, -1, message_id, replacement));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PolicyErrorMap::AddError(const std::string& policy,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int index,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int message_id,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::string& replacement) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddError(PendingError(policy, std::string(), index, message_id, replacement));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 PolicyErrorMap::GetErrors(const std::string& policy) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckReadyAndConvert();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::pair<const_iterator, const_iterator> range = map_.equal_range(policy);
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> list;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (const_iterator it = range.first; it != range.second; ++it)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list.push_back(it->second);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return JoinString(list, '\n');
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PolicyErrorMap::empty() {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckReadyAndConvert();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return map_.empty();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t PolicyErrorMap::size() {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckReadyAndConvert();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return map_.size();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PolicyErrorMap::const_iterator PolicyErrorMap::begin() {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckReadyAndConvert();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return map_.begin();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PolicyErrorMap::const_iterator PolicyErrorMap::end() {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckReadyAndConvert();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return map_.end();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PolicyErrorMap::Clear() {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckReadyAndConvert();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  map_.clear();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PolicyErrorMap::AddError(const PendingError& error) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsReady()) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Convert(error);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_.push_back(error);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PolicyErrorMap::Convert(const PendingError& error) {
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 submessage;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error.has_replacement) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    submessage = l10n_util::GetStringFUTF16(error.message_id,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            ASCIIToUTF16(error.replacement));
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    submessage = l10n_util::GetStringUTF16(error.message_id);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 message;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!error.subkey.empty()) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = l10n_util::GetStringFUTF16(IDS_POLICY_SUBKEY_ERROR,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         ASCIIToUTF16(error.subkey),
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         submessage);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (error.index >= 0) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = l10n_util::GetStringFUTF16(IDS_POLICY_LIST_ENTRY_ERROR,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         base::IntToString16(error.index),
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         submessage);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = submessage;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  map_.insert(std::make_pair(error.policy, message));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PolicyErrorMap::CheckReadyAndConvert() {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsReady());
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < pending_.size(); ++i) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Convert(pending_[i]);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_.clear();
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace policy
169