Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chromeos/network/onc/onc_translator.h" | 5 #include "chromeos/network/onc/onc_translator.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/json/json_reader.h" | 10 #include "base/json/json_reader.h" |
| 11 #include "base/json/json_writer.h" | 11 #include "base/json/json_writer.h" |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/strings/string_util.h" | |
| 13 #include "base/values.h" | 14 #include "base/values.h" |
| 14 #include "chromeos/network/network_state.h" | 15 #include "chromeos/network/network_state.h" |
| 15 #include "chromeos/network/network_util.h" | 16 #include "chromeos/network/network_util.h" |
| 16 #include "chromeos/network/onc/onc_signature.h" | 17 #include "chromeos/network/onc/onc_signature.h" |
| 17 #include "chromeos/network/onc/onc_translation_tables.h" | 18 #include "chromeos/network/onc/onc_translation_tables.h" |
| 18 #include "chromeos/network/shill_property_util.h" | 19 #include "chromeos/network/shill_property_util.h" |
| 19 #include "components/onc/onc_constants.h" | 20 #include "components/onc/onc_constants.h" |
| 20 #include "third_party/cros_system_api/dbus/service_constants.h" | 21 #include "third_party/cros_system_api/dbus/service_constants.h" |
| 21 | 22 |
| 22 namespace chromeos { | 23 namespace chromeos { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 70 private: | 71 private: |
| 71 void TranslateEthernet(); | 72 void TranslateEthernet(); |
| 72 void TranslateOpenVPN(); | 73 void TranslateOpenVPN(); |
| 73 void TranslateIPsec(); | 74 void TranslateIPsec(); |
| 74 void TranslateVPN(); | 75 void TranslateVPN(); |
| 75 void TranslateWiFiWithState(); | 76 void TranslateWiFiWithState(); |
| 76 void TranslateCellularWithState(); | 77 void TranslateCellularWithState(); |
| 77 void TranslateCellularDevice(); | 78 void TranslateCellularDevice(); |
| 78 void TranslateNetworkWithState(); | 79 void TranslateNetworkWithState(); |
| 79 void TranslateIPConfig(); | 80 void TranslateIPConfig(); |
| 81 void TranslateSavedOrStaticIPConfig(const std::string& nameserver_property); | |
| 82 void TranslateSavedIPConfig(); | |
| 83 void TranslateStaticIPConfig(); | |
| 80 | 84 |
| 81 // Creates an ONC object from |dictionary| according to the signature | 85 // Creates an ONC object from |dictionary| according to the signature |
| 82 // associated to |onc_field_name| and adds it to |onc_object_| at | 86 // associated to |onc_field_name| and adds it to |onc_object_| at |
| 83 // |onc_field_name|. | 87 // |onc_field_name|. |
| 84 void TranslateAndAddNestedObject(const std::string& onc_field_name, | 88 void TranslateAndAddNestedObject(const std::string& onc_field_name, |
| 85 const base::DictionaryValue& dictionary); | 89 const base::DictionaryValue& dictionary); |
| 86 | 90 |
| 87 // Creates an ONC object from |shill_dictionary_| according to the signature | 91 // Creates an ONC object from |shill_dictionary_| according to the signature |
| 88 // associated to |onc_field_name| and adds it to |onc_object_| at | 92 // associated to |onc_field_name| and adds it to |onc_object_| at |
| 89 // |onc_field_name|. | 93 // |onc_field_name|. |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 150 TranslateIPsec(); | 154 TranslateIPsec(); |
| 151 } else if (onc_signature_ == &kWiFiWithStateSignature) { | 155 } else if (onc_signature_ == &kWiFiWithStateSignature) { |
| 152 TranslateWiFiWithState(); | 156 TranslateWiFiWithState(); |
| 153 } else if (onc_signature_ == &kCellularWithStateSignature) { | 157 } else if (onc_signature_ == &kCellularWithStateSignature) { |
| 154 if (field_translation_table_ == kCellularDeviceTable) | 158 if (field_translation_table_ == kCellularDeviceTable) |
| 155 TranslateCellularDevice(); | 159 TranslateCellularDevice(); |
| 156 else | 160 else |
| 157 TranslateCellularWithState(); | 161 TranslateCellularWithState(); |
| 158 } else if (onc_signature_ == &kIPConfigSignature) { | 162 } else if (onc_signature_ == &kIPConfigSignature) { |
| 159 TranslateIPConfig(); | 163 TranslateIPConfig(); |
| 164 } else if (onc_signature_ == &kSavedIPConfigSignature) { | |
| 165 TranslateSavedIPConfig(); | |
| 166 } else if (onc_signature_ == &kStaticIPConfigSignature) { | |
| 167 TranslateStaticIPConfig(); | |
| 160 } else { | 168 } else { |
| 161 CopyPropertiesAccordingToSignature(); | 169 CopyPropertiesAccordingToSignature(); |
| 162 } | 170 } |
| 163 return onc_object_.Pass(); | 171 return onc_object_.Pass(); |
| 164 } | 172 } |
| 165 | 173 |
| 166 void ShillToONCTranslator::TranslateEthernet() { | 174 void ShillToONCTranslator::TranslateEthernet() { |
| 167 std::string shill_network_type; | 175 std::string shill_network_type; |
| 168 shill_dictionary_->GetStringWithoutPathExpansion(shill::kTypeProperty, | 176 shill_dictionary_->GetStringWithoutPathExpansion(shill::kTypeProperty, |
| 169 &shill_network_type); | 177 &shill_network_type); |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 364 // Translate nested Cellular, WiFi, etc. properties. | 372 // Translate nested Cellular, WiFi, etc. properties. |
| 365 if (!onc_network_type.empty()) { | 373 if (!onc_network_type.empty()) { |
| 366 onc_object_->SetStringWithoutPathExpansion(::onc::network_config::kType, | 374 onc_object_->SetStringWithoutPathExpansion(::onc::network_config::kType, |
| 367 onc_network_type); | 375 onc_network_type); |
| 368 TranslateAndAddNestedObject(onc_network_type); | 376 TranslateAndAddNestedObject(onc_network_type); |
| 369 } | 377 } |
| 370 | 378 |
| 371 // Since Name is a read only field in Shill unless it's a VPN, it is copied | 379 // Since Name is a read only field in Shill unless it's a VPN, it is copied |
| 372 // here, but not when going the other direction (if it's not a VPN). | 380 // here, but not when going the other direction (if it's not a VPN). |
| 373 std::string name; | 381 std::string name; |
| 374 shill_dictionary_->GetStringWithoutPathExpansion(shill::kNameProperty, | 382 shill_dictionary_->GetStringWithoutPathExpansion(shill::kNameProperty, &name); |
| 375 &name); | |
| 376 onc_object_->SetStringWithoutPathExpansion(::onc::network_config::kName, | 383 onc_object_->SetStringWithoutPathExpansion(::onc::network_config::kName, |
| 377 name); | 384 name); |
| 378 | 385 |
| 379 // Limit ONC state to "NotConnected", "Connected", or "Connecting". | 386 // Limit ONC state to "NotConnected", "Connected", or "Connecting". |
| 380 std::string state; | 387 std::string state; |
| 381 if (shill_dictionary_->GetStringWithoutPathExpansion(shill::kStateProperty, | 388 if (shill_dictionary_->GetStringWithoutPathExpansion(shill::kStateProperty, |
| 382 &state)) { | 389 &state)) { |
| 383 std::string onc_state = ::onc::connection_state::kNotConnected; | 390 std::string onc_state = ::onc::connection_state::kNotConnected; |
| 384 if (NetworkState::StateIsConnected(state)) { | 391 if (NetworkState::StateIsConnected(state)) { |
| 385 onc_state = ::onc::connection_state::kConnected; | 392 onc_state = ::onc::connection_state::kConnected; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 403 | 410 |
| 404 // Shill's Service has an IPConfig property (note the singular), not an | 411 // Shill's Service has an IPConfig property (note the singular), not an |
| 405 // IPConfigs property. However, we require the caller of the translation to | 412 // IPConfigs property. However, we require the caller of the translation to |
| 406 // patch the Shill dictionary before passing it to the translator. | 413 // patch the Shill dictionary before passing it to the translator. |
| 407 const base::ListValue* shill_ipconfigs = NULL; | 414 const base::ListValue* shill_ipconfigs = NULL; |
| 408 if (shill_dictionary_->GetListWithoutPathExpansion(shill::kIPConfigsProperty, | 415 if (shill_dictionary_->GetListWithoutPathExpansion(shill::kIPConfigsProperty, |
| 409 &shill_ipconfigs)) { | 416 &shill_ipconfigs)) { |
| 410 TranslateAndAddListOfObjects(::onc::network_config::kIPConfigs, | 417 TranslateAndAddListOfObjects(::onc::network_config::kIPConfigs, |
| 411 *shill_ipconfigs); | 418 *shill_ipconfigs); |
| 412 } | 419 } |
| 420 | |
| 421 TranslateAndAddNestedObject(::onc::network_config::kSavedIPConfig); | |
| 422 TranslateAndAddNestedObject(::onc::network_config::kStaticIPConfig); | |
| 413 } | 423 } |
| 414 | 424 |
| 415 void ShillToONCTranslator::TranslateIPConfig() { | 425 void ShillToONCTranslator::TranslateIPConfig() { |
| 416 CopyPropertiesAccordingToSignature(); | 426 CopyPropertiesAccordingToSignature(); |
| 417 std::string shill_ip_method; | 427 std::string shill_ip_method; |
| 418 shill_dictionary_->GetStringWithoutPathExpansion(shill::kMethodProperty, | 428 shill_dictionary_->GetStringWithoutPathExpansion(shill::kMethodProperty, |
| 419 &shill_ip_method); | 429 &shill_ip_method); |
| 420 std::string type; | 430 std::string type; |
| 421 if (shill_ip_method == shill::kTypeIPv4 || | 431 if (shill_ip_method == shill::kTypeIPv4 || |
| 422 shill_ip_method == shill::kTypeDHCP) { | 432 shill_ip_method == shill::kTypeDHCP) { |
| 423 type = ::onc::ipconfig::kIPv4; | 433 type = ::onc::ipconfig::kIPv4; |
| 424 } else if (shill_ip_method == shill::kTypeIPv6 || | 434 } else if (shill_ip_method == shill::kTypeIPv6 || |
| 425 shill_ip_method == shill::kTypeDHCP6) { | 435 shill_ip_method == shill::kTypeDHCP6) { |
| 426 type = ::onc::ipconfig::kIPv6; | 436 type = ::onc::ipconfig::kIPv6; |
| 427 } else { | 437 } else { |
| 428 return; // Ignore unhandled IPConfig types, e.g. bootp, zeroconf, ppp | 438 return; // Ignore unhandled IPConfig types, e.g. bootp, zeroconf, ppp |
| 429 } | 439 } |
| 430 | 440 |
| 431 onc_object_->SetStringWithoutPathExpansion(::onc::ipconfig::kType, type); | 441 onc_object_->SetStringWithoutPathExpansion(::onc::ipconfig::kType, type); |
| 432 } | 442 } |
| 433 | 443 |
| 444 void ShillToONCTranslator::TranslateSavedOrStaticIPConfig( | |
| 445 const std::string& nameserver_property) { | |
| 446 CopyPropertiesAccordingToSignature(); | |
| 447 // Saved IP config nameservers are stored as a comma separated list. | |
|
pneubeck (no reviews)
2014/09/04 12:38:45
nit: Saved and static ...
stevenjb
2014/09/04 15:26:21
Done.
| |
| 448 std::string shill_nameservers; | |
| 449 shill_dictionary_->GetStringWithoutPathExpansion( | |
| 450 nameserver_property, &shill_nameservers); | |
| 451 std::vector<std::string> onc_nameserver_vector; | |
| 452 if (Tokenize(shill_nameservers, ",", &onc_nameserver_vector) > 0) { | |
| 453 scoped_ptr<base::ListValue> onc_nameservers(new base::ListValue); | |
| 454 for (std::vector<std::string>::iterator iter = | |
| 455 onc_nameserver_vector.begin(); | |
| 456 iter != onc_nameserver_vector.end(); ++iter) { | |
| 457 onc_nameservers->AppendString(*iter); | |
| 458 } | |
| 459 onc_object_->SetWithoutPathExpansion(::onc::ipconfig::kNameServers, | |
| 460 onc_nameservers.release()); | |
| 461 } | |
| 462 } | |
| 463 | |
| 464 void ShillToONCTranslator::TranslateSavedIPConfig() { | |
| 465 TranslateSavedOrStaticIPConfig(shill::kSavedIPNameServersProperty); | |
| 466 } | |
| 467 | |
| 468 void ShillToONCTranslator::TranslateStaticIPConfig() { | |
| 469 TranslateSavedOrStaticIPConfig(shill::kStaticIPNameServersProperty); | |
| 470 } | |
| 471 | |
| 434 void ShillToONCTranslator::TranslateAndAddNestedObject( | 472 void ShillToONCTranslator::TranslateAndAddNestedObject( |
| 435 const std::string& onc_field_name) { | 473 const std::string& onc_field_name) { |
| 436 TranslateAndAddNestedObject(onc_field_name, *shill_dictionary_); | 474 TranslateAndAddNestedObject(onc_field_name, *shill_dictionary_); |
| 437 } | 475 } |
| 438 | 476 |
| 439 void ShillToONCTranslator::TranslateAndAddNestedObject( | 477 void ShillToONCTranslator::TranslateAndAddNestedObject( |
| 440 const std::string& onc_field_name, | 478 const std::string& onc_field_name, |
| 441 const base::DictionaryValue& dictionary) { | 479 const base::DictionaryValue& dictionary) { |
| 442 const OncFieldSignature* field_signature = | 480 const OncFieldSignature* field_signature = |
| 443 GetFieldSignature(*onc_signature_, onc_field_name); | 481 GetFieldSignature(*onc_signature_, onc_field_name); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 502 } | 540 } |
| 503 | 541 |
| 504 void ShillToONCTranslator::CopyPropertiesAccordingToSignature() { | 542 void ShillToONCTranslator::CopyPropertiesAccordingToSignature() { |
| 505 CopyPropertiesAccordingToSignature(onc_signature_); | 543 CopyPropertiesAccordingToSignature(onc_signature_); |
| 506 } | 544 } |
| 507 | 545 |
| 508 void ShillToONCTranslator::CopyPropertiesAccordingToSignature( | 546 void ShillToONCTranslator::CopyPropertiesAccordingToSignature( |
| 509 const OncValueSignature* value_signature) { | 547 const OncValueSignature* value_signature) { |
| 510 if (value_signature->base_signature) | 548 if (value_signature->base_signature) |
| 511 CopyPropertiesAccordingToSignature(value_signature->base_signature); | 549 CopyPropertiesAccordingToSignature(value_signature->base_signature); |
| 550 if (!value_signature->fields) | |
| 551 return; | |
| 512 for (const OncFieldSignature* field_signature = value_signature->fields; | 552 for (const OncFieldSignature* field_signature = value_signature->fields; |
| 513 field_signature->onc_field_name != NULL; ++field_signature) { | 553 field_signature->onc_field_name != NULL; ++field_signature) { |
| 514 CopyProperty(field_signature); | 554 CopyProperty(field_signature); |
| 515 } | 555 } |
| 516 } | 556 } |
| 517 | 557 |
| 518 void ShillToONCTranslator::CopyProperty( | 558 void ShillToONCTranslator::CopyProperty( |
| 519 const OncFieldSignature* field_signature) { | 559 const OncFieldSignature* field_signature) { |
| 520 std::string shill_property_name; | 560 std::string shill_property_name; |
| 521 const base::Value* shill_value = NULL; | 561 const base::Value* shill_value = NULL; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 574 const base::DictionaryValue& shill_dictionary, | 614 const base::DictionaryValue& shill_dictionary, |
| 575 const OncValueSignature* onc_signature) { | 615 const OncValueSignature* onc_signature) { |
| 576 CHECK(onc_signature != NULL); | 616 CHECK(onc_signature != NULL); |
| 577 | 617 |
| 578 ShillToONCTranslator translator(shill_dictionary, *onc_signature); | 618 ShillToONCTranslator translator(shill_dictionary, *onc_signature); |
| 579 return translator.CreateTranslatedONCObject(); | 619 return translator.CreateTranslatedONCObject(); |
| 580 } | 620 } |
| 581 | 621 |
| 582 } // namespace onc | 622 } // namespace onc |
| 583 } // namespace chromeos | 623 } // namespace chromeos |
| OLD | NEW |