1 //
2 // Copyright (C) 2013 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #include "shill/ethernet/ethernet_eap_provider.h"
18 
19 #include <string>
20 
21 #include "shill/ethernet/ethernet_eap_service.h"
22 #include "shill/manager.h"
23 
24 using std::string;
25 
26 namespace shill {
27 
EthernetEapProvider(ControlInterface * control_interface,EventDispatcher * dispatcher,Metrics * metrics,Manager * manager)28 EthernetEapProvider::EthernetEapProvider(ControlInterface* control_interface,
29                                          EventDispatcher* dispatcher,
30                                          Metrics* metrics,
31                                          Manager* manager)
32     : control_interface_(control_interface),
33       dispatcher_(dispatcher),
34       metrics_(metrics),
35       manager_(manager) {}
36 
~EthernetEapProvider()37 EthernetEapProvider::~EthernetEapProvider() {}
38 
CreateServicesFromProfile(const ProfileRefPtr & profile)39 void EthernetEapProvider::CreateServicesFromProfile(
40     const ProfileRefPtr& profile) {
41   // Since the EthernetEapProvider's service is created during Start(),
42   // there is no need to do anything in this method.
43 }
44 
FindSimilarService(const KeyValueStore & args,Error * error) const45 ServiceRefPtr EthernetEapProvider::FindSimilarService(const KeyValueStore& args,
46                                                       Error* error) const {
47   CHECK_EQ(kTypeEthernetEap, args.LookupString(kTypeProperty, ""))
48       << "Service type must be Ethernet EAP!";
49   return service();
50 }
51 
GetService(const KeyValueStore & args,Error * error)52 ServiceRefPtr EthernetEapProvider::GetService(const KeyValueStore& args,
53                                               Error* error) {
54   return FindSimilarService(args, error);
55 }
56 
CreateTemporaryService(const KeyValueStore & args,Error * error)57 ServiceRefPtr EthernetEapProvider::CreateTemporaryService(
58     const KeyValueStore& args,
59     Error* error) {
60   return new EthernetEapService(control_interface_,
61                                 dispatcher_,
62                                 metrics_,
63                                 manager_);
64 }
65 
CreateTemporaryServiceFromProfile(const ProfileRefPtr & profile,const std::string & entry_name,Error * error)66 ServiceRefPtr EthernetEapProvider::CreateTemporaryServiceFromProfile(
67     const ProfileRefPtr& profile, const std::string& entry_name, Error* error) {
68   return new EthernetEapService(control_interface_,
69                                 dispatcher_,
70                                 metrics_,
71                                 manager_);
72 }
73 
Start()74 void EthernetEapProvider::Start() {
75   if (!service_) {
76     service_ = new EthernetEapService(control_interface_,
77                                       dispatcher_,
78                                       metrics_,
79                                       manager_);
80   }
81   manager_->RegisterService(service_);
82 }
83 
Stop()84 void EthernetEapProvider::Stop() {
85   if (service_) {
86     manager_->DeregisterService(service_);
87   }
88   // Do not destroy the service, since devices may or may not have been
89   // removed as the provider is stopped, and we'd like them to continue
90   // to refer to the same service on restart.
91 }
92 
SetCredentialChangeCallback(Ethernet * device,CredentialChangeCallback callback)93 void EthernetEapProvider::SetCredentialChangeCallback(
94     Ethernet* device, CredentialChangeCallback callback) {
95   callback_map_[device] = callback;
96 }
97 
ClearCredentialChangeCallback(Ethernet * device)98 void EthernetEapProvider::ClearCredentialChangeCallback(Ethernet* device) {
99   CallbackMap::iterator it = callback_map_.find(device);
100   if (it != callback_map_.end()) {
101     callback_map_.erase(it);
102   }
103 }
104 
OnCredentialsChanged() const105 void EthernetEapProvider::OnCredentialsChanged() const {
106   CallbackMap::const_iterator it;
107   for (it = callback_map_.begin(); it != callback_map_.end(); ++it) {
108     CHECK(!it->second.is_null());
109     it->second.Run();
110   }
111 }
112 
113 }  // namespace shill
114