1 // Copyright 2013 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.
8 #include "base/at_exit.h"
10 #include "base/cancelable_callback.h"
11 #include "base/command_line.h"
12 #include "base/file_util.h"
13 #include "base/logging.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/message_loop/message_loop.h"
16 #include "base/run_loop.h"
17 #include "base/strings/string_number_conversions.h"
18 #include "base/strings/string_split.h"
19 #include "base/strings/string_util.h"
20 #include "base/strings/stringprintf.h"
21 #include "base/strings/utf_string_conversions.h"
22 #include "base/time/time.h"
23 #include "components/wifi/wifi_service.h"
25 #if defined(OS_MACOSX)
26 #include "base/mac/scoped_nsautorelease_pool.h"
38 RESULT_WRONG_USAGE
= -1,
43 Result
Main(int argc
, const char* argv
[]);
46 bool ParseCommandLine(int argc
, const char* argv
[]);
49 void Finish(Result result
) {
50 DCHECK_NE(RESULT_PENDING
, result
);
52 if (base::MessageLoop::current())
53 base::MessageLoop::current()->Quit();
56 void OnNetworksChanged(
57 const WiFiService::NetworkGuidList
& network_guid_list
) {
58 VLOG(0) << "Networks Changed: " << network_guid_list
[0];
59 base::DictionaryValue properties
;
61 wifi_service_
->GetProperties(network_guid_list
[0], &properties
, &error
);
62 VLOG(0) << error
<< ":\n" << properties
;
65 void OnNetworkListChanged(
66 const WiFiService::NetworkGuidList
& network_guid_list
) {
67 VLOG(0) << "Network List Changed: " << network_guid_list
.size();
70 #if defined(OS_MACOSX)
71 // Without this there will be a mem leak on osx.
72 base::mac::ScopedNSAutoreleasePool scoped_pool_
;
75 scoped_ptr
<WiFiService
> wifi_service_
;
77 // Need AtExitManager to support AsWeakPtr (in NetLog).
78 base::AtExitManager exit_manager_
;
83 WiFiTest::Result
WiFiTest::Main(int argc
, const char* argv
[]) {
84 if (!ParseCommandLine(argc
, argv
)) {
85 VLOG(0) << "Usage: " << argv
[0] <<
93 " [--network_guid=<network_guid>]"
94 " [--frequency=0|2400|5000]"
95 " [--security=none|WEP-PSK|WPA-PSK|WPA2-PSK]"
96 " [--password=<wifi_password>]"
97 " [<network_guid>]\n";
98 return RESULT_WRONG_USAGE
;
101 base::MessageLoopForIO loop
;
102 result_
= RESULT_PENDING
;
107 bool WiFiTest::ParseCommandLine(int argc
, const char* argv
[]) {
108 CommandLine::Init(argc
, argv
);
109 const CommandLine
& parsed_command_line
= *CommandLine::ForCurrentProcess();
110 std::string network_guid
=
111 parsed_command_line
.GetSwitchValueASCII("network_guid");
112 std::string frequency
=
113 parsed_command_line
.GetSwitchValueASCII("frequency");
114 std::string password
=
115 parsed_command_line
.GetSwitchValueASCII("password");
116 std::string security
=
117 parsed_command_line
.GetSwitchValueASCII("security");
119 if (parsed_command_line
.GetArgs().size() == 1) {
121 network_guid
= base::UTF16ToASCII(parsed_command_line
.GetArgs()[0]);
123 network_guid
= parsed_command_line
.GetArgs()[0];
128 if (parsed_command_line
.HasSwitch("debug"))
129 MessageBoxA(NULL
, __FUNCTION__
, "Debug Me!", MB_OK
);
132 base::MessageLoopForIO loop
;
134 wifi_service_
.reset(WiFiService::Create());
135 wifi_service_
->Initialize(loop
.message_loop_proxy());
137 if (parsed_command_line
.HasSwitch("list")) {
138 base::ListValue network_list
;
139 wifi_service_
->GetVisibleNetworks(std::string(), &network_list
, true);
140 VLOG(0) << network_list
;
144 if (parsed_command_line
.HasSwitch("get_properties")) {
145 if (network_guid
.length() > 0) {
146 base::DictionaryValue properties
;
148 wifi_service_
->GetProperties(network_guid
, &properties
, &error
);
149 VLOG(0) << error
<< ":\n" << properties
;
154 // Optional properties (frequency, password) to use for connect or create.
155 scoped_ptr
<base::DictionaryValue
> properties(new base::DictionaryValue());
157 if (!frequency
.empty()) {
159 if (base::StringToInt(frequency
, &value
)) {
160 properties
->SetInteger("WiFi.Frequency", value
);
161 // fall through to connect.
165 if (!password
.empty())
166 properties
->SetString("WiFi.Passphrase", password
);
168 if (!security
.empty())
169 properties
->SetString("WiFi.Security", security
);
171 if (parsed_command_line
.HasSwitch("create")) {
172 if (!network_guid
.empty()) {
174 std::string new_network_guid
;
175 properties
->SetString("WiFi.SSID", network_guid
);
176 VLOG(0) << "Creating Network: " << *properties
;
177 wifi_service_
->CreateNetwork(
178 false, properties
.Pass(), &new_network_guid
, &error
);
179 VLOG(0) << error
<< ":\n" << new_network_guid
;
184 if (parsed_command_line
.HasSwitch("connect")) {
185 if (!network_guid
.empty()) {
187 if (!properties
->empty()) {
188 VLOG(0) << "Using connect properties: " << *properties
;
189 wifi_service_
->SetProperties(network_guid
, properties
.Pass(), &error
);
192 wifi_service_
->SetEventObservers(
193 loop
.message_loop_proxy(),
194 base::Bind(&WiFiTest::OnNetworksChanged
, base::Unretained(this)),
195 base::Bind(&WiFiTest::OnNetworkListChanged
, base::Unretained(this)));
197 wifi_service_
->StartConnect(network_guid
, &error
);
200 base::MessageLoop::current()->Run();
205 if (parsed_command_line
.HasSwitch("disconnect")) {
206 if (network_guid
.length() > 0) {
208 wifi_service_
->StartDisconnect(network_guid
, &error
);
214 if (parsed_command_line
.HasSwitch("get_key")) {
215 if (network_guid
.length() > 0) {
217 std::string key_data
;
218 wifi_service_
->GetKeyFromSystem(network_guid
, &key_data
, &error
);
219 VLOG(0) << key_data
<< error
;
224 if (parsed_command_line
.HasSwitch("scan")) {
225 wifi_service_
->SetEventObservers(
226 loop
.message_loop_proxy(),
227 base::Bind(&WiFiTest::OnNetworksChanged
, base::Unretained(this)),
228 base::Bind(&WiFiTest::OnNetworkListChanged
, base::Unretained(this)));
229 wifi_service_
->RequestNetworkScan();
230 base::MessageLoop::current()->Run();
239 int main(int argc
, const char* argv
[]) {
240 CommandLine::Init(argc
, argv
);
241 logging::LoggingSettings settings
;
242 settings
.logging_dest
= logging::LOG_TO_SYSTEM_DEBUG_LOG
;
243 logging::InitLogging(settings
);
245 wifi::WiFiTest wifi_test
;
246 return wifi_test
.Main(argc
, argv
);