blob: 1865ed81e4cb6ec17c6ecb79874d8c107a00e435 [file] [log] [blame]
Ben Chanbc49ac72012-04-10 19:59:45 -07001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/scope_logger.h"
6
7#include <vector>
8
9#include <base/string_tokenizer.h>
10#include <base/string_util.h>
11
12using std::string;
13using std::vector;
14
15namespace shill {
16
17namespace {
18
19const int kDefaultVerboseLevel = 0;
20
21// Scope names corresponding to the scope defined by ScopeLogger::Scope.
22const char *const kScopeNames[] = {
23 "cellular",
24 "connection",
25 "crypto",
Ben Chanfad4a0b2012-04-18 15:49:59 -070026 "daemon",
Ben Chanbc49ac72012-04-10 19:59:45 -070027 "dbus",
28 "device",
Ben Chanfad4a0b2012-04-18 15:49:59 -070029 "dhcp",
30 "dns",
Ben Chanbc49ac72012-04-10 19:59:45 -070031 "ethernet",
Ben Chanfad4a0b2012-04-18 15:49:59 -070032 "http",
33 "httpproxy",
Ben Chanbc49ac72012-04-10 19:59:45 -070034 "inet",
35 "manager",
36 "metrics",
37 "modem",
38 "portal",
Ben Chanfad4a0b2012-04-18 15:49:59 -070039 "power",
Ben Chanbc49ac72012-04-10 19:59:45 -070040 "profile",
Ben Chanfad4a0b2012-04-18 15:49:59 -070041 "property",
42 "resolver",
43 "route",
Ben Chanbc49ac72012-04-10 19:59:45 -070044 "rtnl",
45 "service",
46 "storage",
47 "task",
48 "vpn",
49 "wifi",
50};
51
52COMPILE_ASSERT(arraysize(kScopeNames) == ScopeLogger::kNumScopes,
53 scope_tags_does_not_have_expected_number_of_strings);
54
55// TODO(benchan): not using LAZY_INSTANCE_INITIALIZER
56// because of http://crbug.com/114828
57base::LazyInstance<ScopeLogger> g_scope_logger = {0, {{0}}};
58
59} // namespace
60
61// static
62ScopeLogger* ScopeLogger::GetInstance() {
63 return g_scope_logger.Pointer();
64}
65
66ScopeLogger::ScopeLogger()
67 : verbose_level_(kDefaultVerboseLevel) {
68}
69
70ScopeLogger::~ScopeLogger() {
71}
72
73bool ScopeLogger::IsLogEnabled(Scope scope, int verbose_level) const {
74 CHECK_GE(scope, 0);
75 CHECK_LT(scope, kNumScopes);
76
77 return scope_enabled_[scope] && verbose_level <= verbose_level_;
78}
79
80string ScopeLogger::GetAllScopeNames() const {
81 vector<string> names(kScopeNames, kScopeNames + arraysize(kScopeNames));
Ben Chan1c722602012-04-17 17:37:35 -070082 return JoinString(names, '+');
Ben Chanbc49ac72012-04-10 19:59:45 -070083}
84
85string ScopeLogger::GetEnabledScopeNames() const {
86 vector<string> names;
87 for (size_t i = 0; i < arraysize(kScopeNames); ++i) {
88 if (scope_enabled_[i])
89 names.push_back(kScopeNames[i]);
90 }
91 return JoinString(names, '+');
92}
93
94void ScopeLogger::EnableScopesByName(const string &expression) {
95 if (expression.empty()) {
96 DisableAllScopes();
97 return;
98 }
99
100 // As described in the header file, if the first scope name in the
101 // sequence specified by |expression| is not prefixed by a plus or
102 // minus sign, it indicates that all scopes are first disabled before
103 // enabled by |expression|.
104 if (expression[0] != '+' && expression[0] != '-')
105 DisableAllScopes();
106
107 bool enable_scope = true;
108 StringTokenizer tokenizer(expression, "+-");
109 tokenizer.set_options(StringTokenizer::RETURN_DELIMS);
110 while (tokenizer.GetNext()) {
111 if (tokenizer.token_is_delim()) {
112 enable_scope = (tokenizer.token() == "+");
113 continue;
114 }
115
116 if (tokenizer.token().empty())
117 continue;
118
119 size_t i;
120 for (i = 0; i < arraysize(kScopeNames); ++i) {
121 if (tokenizer.token() == kScopeNames[i]) {
122 SetScopeEnabled(static_cast<Scope>(i), enable_scope);
123 break;
124 }
125 }
126 LOG_IF(WARNING, i == arraysize(kScopeNames))
127 << "Unknown scope '" << tokenizer.token() << "'";
128 }
129}
130
131void ScopeLogger::DisableAllScopes() {
132 scope_enabled_.reset();
133}
134
135void ScopeLogger::SetScopeEnabled(Scope scope, bool enabled) {
136 CHECK_GE(scope, 0);
137 CHECK_LT(scope, kNumScopes);
138
139 scope_enabled_[scope] = enabled;
140}
141
142} // namespace shill