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

Side by Side Diff: chrome/browser/chromeos/cros/network_parser.cc

Issue 7453051: This factors out all of the parsing code from the network library (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Finally working Created 9 years, 4 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 The Chromium 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 "chrome/browser/chromeos/cros/network_parser.h"
6
7 #include "base/json/json_writer.h" // for debug output only.
8 #include "base/stringprintf.h"
9 // Needed only for debug output (ConnectionTypeToString).
10 #include "chrome/browser/chromeos/cros/native_network_constants.h"
11
12 namespace chromeos {
13
14 NetworkDeviceParser::NetworkDeviceParser(
15 const EnumMapper<PropertyIndex>* mapper) : mapper_(mapper) {
stevenjb 2011/08/05 18:46:58 Should CHECK(mapper) here since we access it witho
16 }
17
18 NetworkDeviceParser::~NetworkDeviceParser() {
19 }
20
21 NetworkDevice* NetworkDeviceParser::CreateDeviceFromInfo(
22 const std::string& device_path,
23 const DictionaryValue& info) {
24 scoped_ptr<NetworkDevice> device(new NetworkDevice(device_path));
25 if (!UpdateDeviceFromInfo(info, device.get())) {
26 NOTREACHED() << "Unable to create new device";
27 return NULL;
28 }
29 VLOG(2) << "Created device for path " << device_path;
30 return device.release();
31 }
32
33 bool NetworkDeviceParser::UpdateDeviceFromInfo(const DictionaryValue& info,
34 NetworkDevice* device) {
35 for (DictionaryValue::key_iterator iter = info.begin_keys();
36 iter != info.end_keys(); ++iter) {
37 const std::string& key = *iter;
38 Value* value;
39 bool result = info.GetWithoutPathExpansion(key, &value);
40 DCHECK(result);
41 if (result)
42 UpdateStatus(key, *value, device, NULL);
43 }
44 if (VLOG_IS_ON(2)) {
45 std::string json;
46 base::JSONWriter::Write(&info, true, &json);
47 VLOG(2) << "Updated device for path "
48 << device->device_path() << ": " << json;
49 }
50 return true;
51 }
52
53 bool NetworkDeviceParser::UpdateStatus(const std::string& key,
54 const Value& value,
55 NetworkDevice* device,
56 PropertyIndex* index) {
57 PropertyIndex found_index = mapper().Get(key);
58 if (index)
59 *index = found_index;
60 if (!ParseValue(found_index, value, device)) {
61 VLOG(1) << "NetworkDeviceParser: Unhandled key: " << key;
62 return false;
63 } else if (VLOG_IS_ON(2)) {
stevenjb 2011/08/05 18:46:58 nit: No need for else here.
Greg Spencer (Chromium) 2011/08/11 22:19:32 Duh. Removed.
64 std::string value_json;
65 base::JSONWriter::Write(&value, true, &value_json);
66 VLOG(2) << "Updated value on device: "
67 << device->device_path() << "[" << key << "] = " << value_json;
68 }
69 return true;
70 }
71
72 //----------- Network Parser -----------------
73
74 NetworkParser::NetworkParser(const EnumMapper<PropertyIndex>* mapper)
75 : mapper_(mapper) {
stevenjb 2011/08/05 18:46:58 CHECK(mapper)
76 }
77
78 NetworkParser::~NetworkParser() {
79 }
80
81 Network* NetworkParser::CreateNetworkFromInfo(
82 const std::string& service_path,
83 const DictionaryValue& info) {
84 ConnectionType type = ParseTypeFromDictionary(info);
85 scoped_ptr<Network> network(CreateNewNetwork(type, service_path));
86 if (network.get())
87 UpdateNetworkFromInfo(info, network.get());
88 VLOG(2) << "Created Network '" << network->name()
89 << "' from info. Path:" << service_path
90 << " Type:" << ConnectionTypeToString(type);
91 return network.release();
92 }
93
94 // static
95 Network* NetworkParser::CreateNewNetwork(
96 ConnectionType type, const std::string& service_path) {
97 switch (type) {
98 case TYPE_ETHERNET: {
99 EthernetNetwork* ethernet = new EthernetNetwork(service_path);
100 return ethernet;
101 }
102 case TYPE_WIFI: {
103 WifiNetwork* wifi = new WifiNetwork(service_path);
104 return wifi;
105 }
106 case TYPE_CELLULAR: {
107 CellularNetwork* cellular = new CellularNetwork(service_path);
108 return cellular;
109 }
110 case TYPE_VPN: {
111 VirtualNetwork* vpn = new VirtualNetwork(service_path);
112 return vpn;
113 }
114 default: {
115 // If we try and create a service for which we have an unknown
116 // type, then that's a bug, and we will crash.
117 LOG(FATAL) << "Unknown service type: " << type;
118 return NULL;
119 }
120 }
121 }
122
123 bool NetworkParser::UpdateNetworkFromInfo(const DictionaryValue& info,
124 Network* network) {
125 network->set_unique_id("");
126 for (DictionaryValue::key_iterator iter = info.begin_keys();
127 iter != info.end_keys(); ++iter) {
128 const std::string& key = *iter;
129 Value* value;
130 bool res = info.GetWithoutPathExpansion(key, &value);
131 DCHECK(res);
132 if (res)
133 UpdateStatus(key, *value, network, NULL);
134 }
135 if (network->unique_id().empty())
136 network->CalculateUniqueId();
137 VLOG(2) << "Updated network '" << network->name()
138 << "' Path:" << network->service_path() << " Type:"
139 << ConnectionTypeToString(network->type());
140 std::string json;
141 base::JSONWriter::Write(&info, true, &json);
stevenjb 2011/08/05 18:46:58 json unused here
Greg Spencer (Chromium) 2011/08/11 22:19:32 Removed.
142 return true;
143 }
144
145 bool NetworkParser::UpdateStatus(const std::string& key,
146 const Value& value,
147 Network* network,
148 PropertyIndex* index) {
149 PropertyIndex found_index = mapper().Get(key);
150 if (index)
151 *index = found_index;
152 if (!ParseValue(found_index, value, network)) {
153 VLOG(1) << "Unhandled key '" << key << "' in Network: " << network->name()
154 << " ID: " << network->unique_id()
155 << " Type: " << ConnectionTypeToString(network->type());
156 return false;
157 } else if (VLOG_IS_ON(2)) {
stevenjb 2011/08/05 18:46:58 nit: no else
Greg Spencer (Chromium) 2011/08/11 22:19:32 Done.
158 std::string value_json;
159 base::JSONWriter::Write(&value, true, &value_json);
160 VLOG(2) << "Updated value on network: "
161 << network->unique_id() << "[" << key << "] = " << value_json;
162 }
163 return true;
164 }
165
166 bool NetworkParser::ParseValue(PropertyIndex index,
167 const Value& value,
168 Network* network) {
169 switch (index) {
170 case PROPERTY_INDEX_TYPE: {
171 std::string type_string;
172 if (value.GetAsString(&type_string)) {
173 ConnectionType type = ParseType(type_string);
174 LOG_IF(ERROR, type != network->type())
175 << "Network with mismatched type: " << network->service_path()
176 << " " << type << " != " << network->type();
177 return true;
178 }
179 break;
180 }
181 case PROPERTY_INDEX_DEVICE: {
182 std::string device_path;
183 if (!value.GetAsString(&device_path))
184 break;
185 network->set_device_path(device_path);
186 return true;
187 }
188 case PROPERTY_INDEX_NAME: {
189 std::string name;
190 if (value.GetAsString(&name)) {
191 network->SetName(name);
192 return true;
193 }
194 break;
195 }
196 case PROPERTY_INDEX_GUID: {
197 std::string unique_id;
198 if (!value.GetAsString(&unique_id))
199 break;
200 network->set_unique_id(unique_id);
201 return true;
202 }
203 case PROPERTY_INDEX_PROFILE: {
204 // Note: currently this is only provided for non remembered networks.
205 std::string profile_path;
206 if (!value.GetAsString(&profile_path))
207 break;
208 network->set_profile_path(profile_path);
209 return true;
210 }
211 case PROPERTY_INDEX_STATE: {
212 std::string state_string;
213 if (value.GetAsString(&state_string)) {
214 network->SetState(ParseState(state_string));
215 return true;
216 }
217 break;
218 }
219 case PROPERTY_INDEX_MODE: {
220 std::string mode_string;
221 if (value.GetAsString(&mode_string)) {
222 network->mode_ = ParseMode(mode_string);
223 return true;
224 }
225 break;
226 }
227 case PROPERTY_INDEX_ERROR: {
228 std::string error_string;
229 if (value.GetAsString(&error_string)) {
230 network->error_ = ParseError(error_string);
231 return true;
232 }
233 break;
234 }
235 case PROPERTY_INDEX_CONNECTABLE: {
236 bool connectable;
237 if (!value.GetAsBoolean(&connectable))
238 break;
239 network->set_connectable(connectable);
240 return true;
241 }
242 case PROPERTY_INDEX_IS_ACTIVE: {
243 bool is_active;
244 if (!value.GetAsBoolean(&is_active))
245 break;
246 network->set_is_active(is_active);
247 return true;
248 }
249 case PROPERTY_INDEX_AUTO_CONNECT: {
250 bool auto_connect;
251 if (!value.GetAsBoolean(&auto_connect))
252 break;
253 network->set_auto_connect(auto_connect);
254 return true;
255 }
256 case PROPERTY_INDEX_SAVE_CREDENTIALS: {
257 bool save_credentials;
258 if (!value.GetAsBoolean(&save_credentials))
259 break;
260 network->set_save_credentials(save_credentials);
261 return true;
262 }
263 default:
264 break;
265 }
266 return false;
267 }
268
269 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698