Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(120)

Side by Side Diff: webrtc/base/optionsfile.cc

Issue 2877023002: Move webrtc/{base => rtc_base} (Closed)
Patch Set: update presubmit.py and DEPS include rules Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/base/optionsfile.h ('k') | webrtc/base/optionsfile_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright 2008 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "webrtc/base/optionsfile.h"
12
13 #include <ctype.h>
14
15 #include "webrtc/base/logging.h"
16 #include "webrtc/base/stream.h"
17 #include "webrtc/base/stringencode.h"
18
19 namespace rtc {
20
21 OptionsFile::OptionsFile(const std::string &path) : path_(path) {
22 }
23
24 OptionsFile::~OptionsFile() = default;
25
26 bool OptionsFile::Load() {
27 options_.clear();
28 // Open file.
29 FileStream stream;
30 int err;
31 if (!stream.Open(path_, "r", &err)) {
32 LOG_F(LS_WARNING) << "Could not open file, err=" << err;
33 // We do not consider this an error because we expect there to be no file
34 // until the user saves a setting.
35 return true;
36 }
37 // Read in all its data.
38 std::string line;
39 StreamResult res;
40 for (;;) {
41 res = stream.ReadLine(&line);
42 if (res != SR_SUCCESS) {
43 break;
44 }
45 size_t equals_pos = line.find('=');
46 if (equals_pos == std::string::npos) {
47 // We do not consider this an error. Instead we ignore the line and
48 // keep going.
49 LOG_F(LS_WARNING) << "Ignoring malformed line in " << path_;
50 continue;
51 }
52 std::string key(line, 0, equals_pos);
53 std::string value(line, equals_pos + 1, line.length() - (equals_pos + 1));
54 options_[key] = value;
55 }
56 if (res != SR_EOS) {
57 LOG_F(LS_ERROR) << "Error when reading from file";
58 return false;
59 } else {
60 return true;
61 }
62 }
63
64 bool OptionsFile::Save() {
65 // Open file.
66 FileStream stream;
67 int err;
68 if (!stream.Open(path_, "w", &err)) {
69 LOG_F(LS_ERROR) << "Could not open file, err=" << err;
70 return false;
71 }
72 // Write out all the data.
73 StreamResult res = SR_SUCCESS;
74 size_t written;
75 int error;
76 for (OptionsMap::const_iterator i = options_.begin(); i != options_.end();
77 ++i) {
78 res = stream.WriteAll(i->first.c_str(), i->first.length(), &written,
79 &error);
80 if (res != SR_SUCCESS) {
81 break;
82 }
83 res = stream.WriteAll("=", 1, &written, &error);
84 if (res != SR_SUCCESS) {
85 break;
86 }
87 res = stream.WriteAll(i->second.c_str(), i->second.length(), &written,
88 &error);
89 if (res != SR_SUCCESS) {
90 break;
91 }
92 res = stream.WriteAll("\n", 1, &written, &error);
93 if (res != SR_SUCCESS) {
94 break;
95 }
96 }
97 if (res != SR_SUCCESS) {
98 LOG_F(LS_ERROR) << "Unable to write to file";
99 return false;
100 } else {
101 return true;
102 }
103 }
104
105 bool OptionsFile::IsLegalName(const std::string &name) {
106 for (size_t pos = 0; pos < name.length(); ++pos) {
107 if (name[pos] == '\n' || name[pos] == '\\' || name[pos] == '=') {
108 // Illegal character.
109 LOG(LS_WARNING) << "Ignoring operation for illegal option " << name;
110 return false;
111 }
112 }
113 return true;
114 }
115
116 bool OptionsFile::IsLegalValue(const std::string &value) {
117 for (size_t pos = 0; pos < value.length(); ++pos) {
118 if (value[pos] == '\n' || value[pos] == '\\') {
119 // Illegal character.
120 LOG(LS_WARNING) << "Ignoring operation for illegal value " << value;
121 return false;
122 }
123 }
124 return true;
125 }
126
127 bool OptionsFile::GetStringValue(const std::string& option,
128 std::string *out_val) const {
129 LOG(LS_VERBOSE) << "OptionsFile::GetStringValue "
130 << option;
131 if (!IsLegalName(option)) {
132 return false;
133 }
134 OptionsMap::const_iterator i = options_.find(option);
135 if (i == options_.end()) {
136 return false;
137 }
138 *out_val = i->second;
139 return true;
140 }
141
142 bool OptionsFile::GetIntValue(const std::string& option,
143 int *out_val) const {
144 LOG(LS_VERBOSE) << "OptionsFile::GetIntValue "
145 << option;
146 if (!IsLegalName(option)) {
147 return false;
148 }
149 OptionsMap::const_iterator i = options_.find(option);
150 if (i == options_.end()) {
151 return false;
152 }
153 return FromString(i->second, out_val);
154 }
155
156 bool OptionsFile::SetStringValue(const std::string& option,
157 const std::string& value) {
158 LOG(LS_VERBOSE) << "OptionsFile::SetStringValue "
159 << option << ":" << value;
160 if (!IsLegalName(option) || !IsLegalValue(value)) {
161 return false;
162 }
163 options_[option] = value;
164 return true;
165 }
166
167 bool OptionsFile::SetIntValue(const std::string& option,
168 int value) {
169 LOG(LS_VERBOSE) << "OptionsFile::SetIntValue "
170 << option << ":" << value;
171 if (!IsLegalName(option)) {
172 return false;
173 }
174 return ToString(value, &options_[option]);
175 }
176
177 bool OptionsFile::RemoveValue(const std::string& option) {
178 LOG(LS_VERBOSE) << "OptionsFile::RemoveValue " << option;
179 if (!IsLegalName(option)) {
180 return false;
181 }
182 options_.erase(option);
183 return true;
184 }
185
186 } // namespace rtc
OLDNEW
« no previous file with comments | « webrtc/base/optionsfile.h ('k') | webrtc/base/optionsfile_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698