Merge lp:~unity-api-team/indicator-network/fix-gmainloop-syncing into lp:indicator-network/15.04
- fix-gmainloop-syncing
- Merge into trunk.15.04
Status: | Merged | ||||||||
---|---|---|---|---|---|---|---|---|---|
Approved by: | Marcus Tomlinson | ||||||||
Approved revision: | 469 | ||||||||
Merged at revision: | 460 | ||||||||
Proposed branch: | lp:~unity-api-team/indicator-network/fix-gmainloop-syncing | ||||||||
Merge into: | lp:indicator-network/15.04 | ||||||||
Prerequisite: | lp:~unity-api-team/indicator-network/increase-dbus-timeouts | ||||||||
Diff against target: |
1839 lines (+662/-302) 34 files modified
src/connectivity-cpp/dbus-cpp/services/nm.h (+2/-11) src/connectivity-cpp/src/platform/nmofono/manager.cpp (+45/-40) src/connectivity-cpp/src/platform/nmofono/manager.h (+4/-0) src/connectivity-cpp/src/platform/nmofono/wifi/access-point.cpp (+21/-12) src/connectivity-cpp/src/platform/nmofono/wifi/access-point.h (+49/-3) src/connectivity-cpp/src/platform/nmofono/wifi/grouped-access-point.cpp (+5/-5) src/connectivity-cpp/src/platform/nmofono/wifi/grouped-access-point.h (+1/-2) src/connectivity-cpp/src/platform/nmofono/wifi/link.cpp (+19/-61) src/indicator/CMakeLists.txt (+2/-3) src/indicator/connectivity-service/connectivity-service.cpp (+21/-5) src/indicator/connectivity-service/connectivity-service.h (+4/-1) src/indicator/indicator-network-service.cpp (+2/-0) src/indicator/menuitems/access-point-item.cpp (+64/-49) src/indicator/menuitems/access-point-item.h (+44/-0) src/indicator/modem-manager.cpp (+17/-5) src/indicator/modem-manager.h (+11/-1) src/indicator/modem.cpp (+114/-34) src/indicator/modem.h (+4/-1) src/indicator/quick-access-section.cpp (+23/-11) src/indicator/quick-access-section.h (+4/-1) src/indicator/root-state.cpp (+38/-9) src/indicator/root-state.h (+4/-1) src/indicator/sim-unlock-dialog.h (+3/-0) src/indicator/wifi-link-item.cpp (+51/-22) src/indicator/wifi-link-item.h (+43/-0) src/indicator/wifi-section.cpp (+32/-8) src/indicator/wifi-section.h (+1/-1) src/indicator/wwan-link-item.cpp (+10/-2) src/indicator/wwan-section.cpp (+8/-1) src/indicator/wwan-section.h (+1/-1) src/menumodel-cpp/gio-helpers/util.cpp (+10/-10) src/menumodel-cpp/gio-helpers/util.h (+2/-2) tests/unit/indicator/menuitems/CMakeLists.txt (+1/-0) tests/unit/indicator/menuitems/test-access-point-item.cpp (+2/-0) |
||||||||
To merge this branch: | bzr merge lp:~unity-api-team/indicator-network/fix-gmainloop-syncing | ||||||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
PS Jenkins bot (community) | continuous-integration | Needs Fixing | |
Marcus Tomlinson (community) | Approve | ||
Review via email: mp+240047@code.launchpad.net |
Commit message
* Fix GMainLoopDispatch dispatching ordering when
called inside GMainLoop already
* Fix GMainLoopDispatch locking
* Force all signals from external (dbus-cpp) threads through
GMainLoopDispatch
Description of the change
PS Jenkins bot (ps-jenkins) wrote : | # |
Charles Kerr (charlesk) wrote : | # |
Approved, with a fair number of comments @ https:/
Marcus Tomlinson (marcustomlinson) wrote : | # |
Approve comment left on https:/
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:466
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
- 468. By Antti Kaijanmäki
-
races races all the way..
- 469. By Antti Kaijanmäki
-
blah..
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:468
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
Preview Diff
1 | === modified file 'src/connectivity-cpp/dbus-cpp/services/nm.h' |
2 | --- src/connectivity-cpp/dbus-cpp/services/nm.h 2014-10-31 14:07:40 +0000 |
3 | +++ src/connectivity-cpp/dbus-cpp/services/nm.h 2014-10-31 14:07:40 +0000 |
4 | @@ -911,7 +911,7 @@ |
5 | return result.value(); |
6 | } |
7 | |
8 | - std::vector<Device> get_devices() |
9 | + std::vector<core::dbus::types::ObjectPath> get_devices() |
10 | { |
11 | auto result = |
12 | object->invoke_method_synchronously< |
13 | @@ -921,16 +921,7 @@ |
14 | if (result.is_error()) |
15 | connectivity::throw_dbus_exception(result.error()); |
16 | |
17 | - std::vector<Device> devices; |
18 | - for (const auto& path : result.value()) |
19 | - { |
20 | - devices.emplace_back( |
21 | - Device( |
22 | - service, |
23 | - service->object_for_path(path))); |
24 | - } |
25 | - |
26 | - return devices; |
27 | + return result.value(); |
28 | } |
29 | |
30 | NetworkManager(std::shared_ptr<core::dbus::Service> &service, |
31 | |
32 | === modified file 'src/connectivity-cpp/src/platform/nmofono/manager.cpp' |
33 | --- src/connectivity-cpp/src/platform/nmofono/manager.cpp 2014-10-09 10:58:30 +0000 |
34 | +++ src/connectivity-cpp/src/platform/nmofono/manager.cpp 2014-10-31 14:07:40 +0000 |
35 | @@ -172,29 +172,11 @@ |
36 | p->urfkill->switches[fdo::URfkill::Interface::Killswitch::Type::wlan]); |
37 | p->m_wifiKillSwitch->state().changed().connect(std::bind(&Private::updateHasWifi, p.get())); |
38 | |
39 | - p->nm->device_added->connect([this](const dbus::types::ObjectPath &path){ |
40 | -#ifdef INDICATOR_NETWORK_TRACE_MESSAGES |
41 | - std::cout << "Device Added:" << path.as_string() << std::endl; |
42 | -#endif |
43 | - auto links = p->m_links.get(); |
44 | - for (const auto &dev : links) { |
45 | - if (std::dynamic_pointer_cast<wifi::Link>(dev)->device_path() == path) { |
46 | - // already in the list |
47 | - return; |
48 | - } |
49 | - } |
50 | - |
51 | - NM::Interface::Device dev(p->nm->service, |
52 | - p->nm->service->object_for_path(path)); |
53 | - if (dev.type() == NM::Interface::Device::Type::wifi) { |
54 | - links.insert(std::make_shared<wifi::Link>(dev, |
55 | - *p->nm.get(), |
56 | - p->m_wifiKillSwitch)); |
57 | - p->m_links.set(links); |
58 | - } |
59 | - |
60 | - p->updateHasWifi(); |
61 | - }); |
62 | + p->nm->device_added->connect(std::bind(&Manager::device_added, this, std::placeholders::_1)); |
63 | + for(const auto &path : p->nm->get_devices()) { |
64 | + device_added(path); |
65 | + } |
66 | + |
67 | p->nm->device_removed->connect([this](const dbus::types::ObjectPath &path){ |
68 | #ifdef INDICATOR_NETWORK_TRACE_MESSAGES |
69 | std::cout << "Device Removed:" << path.as_string() << std::endl; |
70 | @@ -210,23 +192,6 @@ |
71 | |
72 | p->updateHasWifi(); |
73 | }); |
74 | - std::set<std::shared_ptr<networking::Link> > links; |
75 | - for(auto dev : p->nm->get_devices()) { |
76 | - switch (dev.type()) { |
77 | - case NM::Interface::Device::Type::wifi: |
78 | - { |
79 | - std::shared_ptr<networking::Link> link; |
80 | - link.reset(new wifi::Link(dev, |
81 | - *p->nm.get(), |
82 | - p->m_wifiKillSwitch)); |
83 | - links.insert(link); |
84 | - break; |
85 | - } |
86 | - default: |
87 | - ; |
88 | - } |
89 | - } |
90 | - p->m_links.set(links); |
91 | |
92 | updateNetworkingStatus(p->nm->state->get()); |
93 | p->nm->properties_changed->connect([this](NM::Interface::NetworkManager::Signal::PropertiesChanged::ArgumentType map) { |
94 | @@ -259,6 +224,46 @@ |
95 | } |
96 | |
97 | void |
98 | +Manager::device_added(const dbus::types::ObjectPath &path) |
99 | +{ |
100 | +#ifdef INDICATOR_NETWORK_TRACE_MESSAGES |
101 | + std::cout << "Device Added:" << path.as_string() << std::endl; |
102 | +#endif |
103 | + auto links = p->m_links.get(); |
104 | + |
105 | + for (const auto &dev : links) { |
106 | + if (std::dynamic_pointer_cast<wifi::Link>(dev)->device_path() == path) { |
107 | + // already in the list |
108 | + return; |
109 | + } |
110 | + } |
111 | + |
112 | + connectivity::networking::Link::Ptr link; |
113 | + try { |
114 | + NM::Interface::Device dev(p->nm->service, |
115 | + p->nm->service->object_for_path(path)); |
116 | + if (dev.type() == NM::Interface::Device::Type::wifi) { |
117 | + link = std::make_shared<wifi::Link>(dev, |
118 | + *p->nm.get(), |
119 | + p->m_wifiKillSwitch); |
120 | + } |
121 | + } catch (const std::exception &e) { |
122 | + std::cerr << __PRETTY_FUNCTION__ << ": failed to create Device proxy for "<< path.as_string() << ": " << std::endl |
123 | + << "\t" << e.what() << std::endl |
124 | + << "\tIgnoring." << std::endl; |
125 | + return; |
126 | + } |
127 | + |
128 | + if (link) { |
129 | + links.insert(link); |
130 | + p->m_links.set(links); |
131 | + } |
132 | + |
133 | + p->updateHasWifi(); |
134 | +} |
135 | + |
136 | + |
137 | +void |
138 | Manager::enableFlightMode() |
139 | { |
140 | #ifdef INDICATOR_NETWORK_TRACE_MESSAGES |
141 | |
142 | === modified file 'src/connectivity-cpp/src/platform/nmofono/manager.h' |
143 | --- src/connectivity-cpp/src/platform/nmofono/manager.h 2014-09-25 00:06:12 +0000 |
144 | +++ src/connectivity-cpp/src/platform/nmofono/manager.h 2014-10-31 14:07:40 +0000 |
145 | @@ -20,6 +20,7 @@ |
146 | #define PLATFORM_NMOFONO_MANAGER |
147 | |
148 | #include <connectivity/networking/manager.h> |
149 | +#include <core/dbus/types/object_path.h> |
150 | |
151 | namespace core { |
152 | namespace dbus { |
153 | @@ -61,6 +62,9 @@ |
154 | const core::Property<std::set<std::shared_ptr<connectivity::networking::Service>>>&services() const override; |
155 | const core::Property<connectivity::networking::Manager::NetworkingStatus> & status() const override; |
156 | const core::Property<std::uint32_t>& characteristics() const override; |
157 | + |
158 | +private: |
159 | + void device_added(const core::dbus::types::ObjectPath &path); |
160 | }; |
161 | |
162 | #endif |
163 | |
164 | === modified file 'src/connectivity-cpp/src/platform/nmofono/wifi/access-point.cpp' |
165 | --- src/connectivity-cpp/src/platform/nmofono/wifi/access-point.cpp 2014-08-22 12:18:55 +0000 |
166 | +++ src/connectivity-cpp/src/platform/nmofono/wifi/access-point.cpp 2014-10-31 14:07:40 +0000 |
167 | @@ -34,11 +34,11 @@ |
168 | |
169 | std::string ssid; |
170 | // Note: raw_ssid is _not_ guaranteed to be null terminated. |
171 | - const std::vector<std::int8_t> &raw_ssid = m_ap.ssid->get(); |
172 | - if(g_utf8_validate((const char*)(&raw_ssid[0]), raw_ssid.size(), nullptr)) { |
173 | - ssid = std::string(raw_ssid.begin(), raw_ssid.end()); |
174 | + m_raw_ssid = m_ap.ssid->get(); |
175 | + if(g_utf8_validate((const char*)(&m_raw_ssid[0]), m_raw_ssid.size(), nullptr)) { |
176 | + ssid = std::string(m_raw_ssid.begin(), m_raw_ssid.end()); |
177 | } else { |
178 | - for (auto c : m_ap.ssid->get()) { |
179 | + for (auto c : m_raw_ssid) { |
180 | if (isprint(c)) { |
181 | ssid += (char)c; |
182 | } else { |
183 | @@ -58,6 +58,15 @@ |
184 | } |
185 | } |
186 | }); |
187 | + |
188 | + m_flags = m_ap.flags->get(); |
189 | + /* NetworkManager seems to set the wpa and rns flags |
190 | + * for AccessPoints on the same network in a total random manner. |
191 | + * Sometimes only wpa_flags or rns_flags is set and sometimes |
192 | + * they both are set but always to the same value |
193 | + */ |
194 | + m_secflags = m_ap.wpa_flags->get()|m_ap.rsn_flags->get(); |
195 | + m_mode = m_ap.mode->get(); |
196 | } |
197 | |
198 | const core::dbus::types::ObjectPath AccessPoint::object_path() const { |
199 | @@ -79,6 +88,11 @@ |
200 | return m_ssid; |
201 | } |
202 | |
203 | +const std::vector<std::int8_t>& AccessPoint::raw_ssid() const |
204 | +{ |
205 | + return m_raw_ssid; |
206 | +} |
207 | + |
208 | bool AccessPoint::secured() const |
209 | { |
210 | return m_secured; |
211 | @@ -93,14 +107,9 @@ |
212 | if(this == &other) |
213 | return true; |
214 | return m_ssid == other.m_ssid && |
215 | - m_ap.flags->get() == other.m_ap.flags->get() && |
216 | - /* NetworkManager seems to set the wpa and rns flags |
217 | - * for AccessPoints on the same network in a total random manner. |
218 | - * Sometimes only wpa_flags or rns_flags is set and sometimes |
219 | - * they both are set but always to the same value |
220 | - */ |
221 | - (m_ap.wpa_flags->get()|m_ap.rsn_flags->get()) == (other.m_ap.wpa_flags->get()|other.m_ap.rsn_flags->get()) && |
222 | - m_ap.mode->get() == other.m_ap.mode->get(); |
223 | + m_flags == other.m_flags && |
224 | + m_secflags == other.m_secflags && |
225 | + m_mode == other.m_mode; |
226 | } |
227 | |
228 | } |
229 | |
230 | === modified file 'src/connectivity-cpp/src/platform/nmofono/wifi/access-point.h' |
231 | --- src/connectivity-cpp/src/platform/nmofono/wifi/access-point.h 2014-08-19 19:55:15 +0000 |
232 | +++ src/connectivity-cpp/src/platform/nmofono/wifi/access-point.h 2014-10-31 14:07:40 +0000 |
233 | @@ -40,10 +40,52 @@ |
234 | |
235 | class AccessPoint : public connectivity::networking::wifi::AccessPoint |
236 | { |
237 | - |
238 | public: |
239 | typedef std::shared_ptr<AccessPoint> Ptr; |
240 | |
241 | + struct Key { |
242 | + std::string ssid; |
243 | + uint32_t flags; |
244 | + uint32_t secflags; |
245 | + uint32_t mode; |
246 | + |
247 | + bool operator<(const Key &other) const |
248 | + { |
249 | + // Standard lexigraphic comparison. |
250 | + if(ssid < other.ssid) |
251 | + return true; |
252 | + if(ssid > other.ssid) |
253 | + return false; |
254 | + |
255 | + if(flags < other.flags) |
256 | + return true; |
257 | + if(flags > other.flags) |
258 | + return false; |
259 | + |
260 | + if(secflags < other.secflags) |
261 | + return true; |
262 | + if(secflags > secflags) |
263 | + return false; |
264 | + |
265 | + if(mode < other.mode) |
266 | + return true; |
267 | + if(mode > other.mode) |
268 | + return false; |
269 | + return false; |
270 | + } |
271 | + |
272 | + Key() = delete; |
273 | + Key(const AccessPoint::Ptr &curap) |
274 | + { |
275 | + ssid = curap->ssid(); |
276 | + flags = curap->m_flags; |
277 | + secflags = curap->m_secflags; |
278 | + mode = curap->m_mode; |
279 | + } |
280 | + }; |
281 | + friend class Key; |
282 | + |
283 | + |
284 | AccessPoint(const org::freedesktop::NetworkManager::Interface::AccessPoint &ap); |
285 | const core::Property<double>& strength() const; |
286 | virtual ~AccessPoint() = default; |
287 | @@ -54,6 +96,7 @@ |
288 | const core::Property<std::chrono::system_clock::time_point>& lastConnected() const; |
289 | |
290 | const std::string& ssid() const override; |
291 | + const std::vector<std::int8_t>& raw_ssid() const; |
292 | |
293 | bool secured() const override; |
294 | |
295 | @@ -61,8 +104,6 @@ |
296 | |
297 | const core::dbus::types::ObjectPath object_path() const; |
298 | |
299 | - const org::freedesktop::NetworkManager::Interface::AccessPoint& get_ap() const { return m_ap; } |
300 | - |
301 | bool operator==(const platform::nmofono::wifi::AccessPoint &other) const; |
302 | bool operator!=(const platform::nmofono::wifi::AccessPoint &other) const { return !(*this == other); }; |
303 | |
304 | @@ -71,8 +112,13 @@ |
305 | core::Property<std::chrono::system_clock::time_point> m_lastConnected; |
306 | org::freedesktop::NetworkManager::Interface::AccessPoint m_ap; |
307 | std::string m_ssid; |
308 | + std::vector<std::int8_t> m_raw_ssid; |
309 | bool m_secured; |
310 | bool m_adhoc; |
311 | + |
312 | + std::uint32_t m_flags; |
313 | + std::uint32_t m_secflags; |
314 | + std::uint32_t m_mode; |
315 | }; |
316 | |
317 | } |
318 | |
319 | === modified file 'src/connectivity-cpp/src/platform/nmofono/wifi/grouped-access-point.cpp' |
320 | --- src/connectivity-cpp/src/platform/nmofono/wifi/grouped-access-point.cpp 2014-10-09 10:58:30 +0000 |
321 | +++ src/connectivity-cpp/src/platform/nmofono/wifi/grouped-access-point.cpp 2014-10-31 14:07:40 +0000 |
322 | @@ -156,11 +156,6 @@ |
323 | return p->aplist.at(0)->object_path(); |
324 | } |
325 | |
326 | -const org::freedesktop::NetworkManager::Interface::AccessPoint& GroupedAccessPoint::get_ap() const { |
327 | - std::lock_guard<std::mutex> l(p->m); |
328 | - return p->aplist.at(0)->get_ap(); |
329 | -} |
330 | - |
331 | const core::Property<double>& GroupedAccessPoint::strength() const |
332 | { |
333 | std::lock_guard<std::mutex> l(p->m); |
334 | @@ -177,7 +172,12 @@ |
335 | { |
336 | std::lock_guard<std::mutex> l(p->m); |
337 | return p->aplist.at(0)->ssid(); |
338 | +} |
339 | |
340 | +const std::vector<std::int8_t>& GroupedAccessPoint::raw_ssid() const |
341 | +{ |
342 | + std::lock_guard<std::mutex> l(p->m); |
343 | + return p->aplist.at(0)->raw_ssid(); |
344 | } |
345 | |
346 | bool GroupedAccessPoint::secured() const |
347 | |
348 | === modified file 'src/connectivity-cpp/src/platform/nmofono/wifi/grouped-access-point.h' |
349 | --- src/connectivity-cpp/src/platform/nmofono/wifi/grouped-access-point.h 2014-08-19 19:55:15 +0000 |
350 | +++ src/connectivity-cpp/src/platform/nmofono/wifi/grouped-access-point.h 2014-10-31 14:07:40 +0000 |
351 | @@ -57,6 +57,7 @@ |
352 | const core::Property<std::chrono::system_clock::time_point>& lastConnected() const; |
353 | |
354 | const std::string& ssid() const override; |
355 | + const std::vector<std::int8_t>& raw_ssid() const; |
356 | |
357 | bool secured() const override; |
358 | |
359 | @@ -64,8 +65,6 @@ |
360 | |
361 | const core::dbus::types::ObjectPath object_path() const; |
362 | |
363 | - const org::freedesktop::NetworkManager::Interface::AccessPoint& get_ap() const; |
364 | - |
365 | void add_ap(std::shared_ptr<platform::nmofono::wifi::AccessPoint> &ap); |
366 | void remove_ap(std::shared_ptr<platform::nmofono::wifi::AccessPoint> &ap); |
367 | int num_aps() const; |
368 | |
369 | === modified file 'src/connectivity-cpp/src/platform/nmofono/wifi/link.cpp' |
370 | --- src/connectivity-cpp/src/platform/nmofono/wifi/link.cpp 2014-10-09 10:58:30 +0000 |
371 | +++ src/connectivity-cpp/src/platform/nmofono/wifi/link.cpp 2014-10-31 14:07:40 +0000 |
372 | @@ -30,58 +30,6 @@ |
373 | |
374 | using core::Property; |
375 | |
376 | -struct AccessPointKey { |
377 | - std::string ssid; |
378 | - uint32_t flags; |
379 | - uint32_t wpa_flags; |
380 | - uint32_t rsn_flags; |
381 | - uint32_t mode; |
382 | - |
383 | - bool operator<(const AccessPointKey &other) const |
384 | - { |
385 | - // Standard lexigraphic comparison. |
386 | - if(ssid < other.ssid) |
387 | - return true; |
388 | - if(ssid > other.ssid) |
389 | - return false; |
390 | - |
391 | - if(flags < other.flags) |
392 | - return true; |
393 | - if(flags > other.flags) |
394 | - return false; |
395 | - |
396 | - /* NetworkManager seems to set the wpa and rns flags |
397 | - * for AccessPoints on the same network in a total random manner. |
398 | - * Sometimes only wpa_flags or rns_flags is set and sometimes |
399 | - * they both are set but always to the same value |
400 | - */ |
401 | - if((wpa_flags|rsn_flags) < (other.wpa_flags|other.rsn_flags)) |
402 | - return true; |
403 | - if((wpa_flags|rsn_flags) > (other.wpa_flags|other.rsn_flags)) |
404 | - return false; |
405 | - |
406 | - if(mode < other.mode) |
407 | - return true; |
408 | - if(mode > other.mode) |
409 | - return false; |
410 | - return false; |
411 | - } |
412 | -}; |
413 | - |
414 | -namespace { |
415 | - |
416 | -AccessPointKey build_key(const std::shared_ptr<platform::nmofono::wifi::AccessPoint> &curap) |
417 | -{ |
418 | - AccessPointKey k; |
419 | - k.ssid = curap->ssid(); |
420 | - k.flags = curap->get_ap().flags->get(); |
421 | - k.wpa_flags = curap->get_ap().wpa_flags->get(); |
422 | - k.rsn_flags = curap->get_ap().rsn_flags->get(); |
423 | - k.mode = curap->get_ap().mode->get(); |
424 | - return k; |
425 | -} |
426 | - |
427 | -} |
428 | |
429 | struct Link::Private |
430 | { |
431 | @@ -103,7 +51,7 @@ |
432 | // hack hack |
433 | std::vector<core::ScopedConnection> switchConnection; |
434 | |
435 | - std::map<AccessPointKey, std::shared_ptr<GroupedAccessPoint>> grouper; |
436 | + std::map<AccessPoint::Key, std::shared_ptr<GroupedAccessPoint>> grouper; |
437 | bool disabled; |
438 | std::uint32_t lastState; |
439 | std::string name; |
440 | @@ -165,13 +113,23 @@ |
441 | return; |
442 | } |
443 | } |
444 | + |
445 | + platform::nmofono::wifi::AccessPoint::Ptr shap; |
446 | + try { |
447 | + NM::Interface::AccessPoint ap(p->nm.service->object_for_path(path)); |
448 | + shap = std::make_shared<platform::nmofono::wifi::AccessPoint>(ap); |
449 | + } catch(const std::exception &e) { |
450 | + std::cerr << __PRETTY_FUNCTION__ << ": failed to create AccessPoint proxy for "<< path.as_string() << ": " << std::endl |
451 | + << "\t" << e.what() << std::endl |
452 | + << "\tIgnoring." << std::endl; |
453 | + return; |
454 | + } |
455 | + |
456 | auto list = p->rawAccessPoints.get(); |
457 | - NM::Interface::AccessPoint ap(p->nm.service->object_for_path(path)); |
458 | - auto shap = std::make_shared<platform::nmofono::wifi::AccessPoint>(ap); |
459 | list.insert(shap); |
460 | p->rawAccessPoints.set(list); |
461 | |
462 | - auto k = build_key(shap); |
463 | + auto k = AccessPoint::Key(shap); |
464 | if(p->grouper.find(k) != p->grouper.end()) { |
465 | p->grouper[k]->add_ap(shap); |
466 | } else { |
467 | @@ -200,7 +158,7 @@ |
468 | } |
469 | } |
470 | if (!shap) { |
471 | - std::cerr << "Tried to remove access point " << path.as_string() << " that has not been added." << std::endl; |
472 | + std::cerr << __PRETTY_FUNCTION__ << ": Tried to remove access point " << path.as_string() << " that has not been added." << std::endl; |
473 | return; |
474 | } |
475 | p->rawAccessPoints.set(list); |
476 | @@ -345,11 +303,11 @@ |
477 | // The accesspoint interface does not provide this property so we need to coax it out of |
478 | // derived classes. |
479 | if(ap) { |
480 | - ssid = ap->get_ap().ssid->get(); |
481 | + ssid = ap->raw_ssid(); |
482 | } else { |
483 | std::shared_ptr<AccessPoint> bap = std::dynamic_pointer_cast<AccessPoint>(accessPoint); |
484 | assert(bap); |
485 | - ssid = bap->get_ap().ssid->get(); |
486 | + ssid = bap->raw_ssid(); |
487 | } |
488 | NM::Interface::Connection *found = nullptr; |
489 | auto connections = p->dev.get_available_connections(); |
490 | @@ -360,7 +318,7 @@ |
491 | if (conf.first == "ssid") { |
492 | std::vector<int8_t> value; |
493 | value = conf.second.as<std::vector<std::int8_t>>(); |
494 | - if (value == ap->get_ap().ssid->get()) { |
495 | + if (value == ap->raw_ssid()) { |
496 | found = &con; |
497 | break; |
498 | } |
499 | @@ -384,7 +342,7 @@ |
500 | /// @todo getting the ssid multiple times over dbus is stupid. |
501 | |
502 | std::map<std::string, dbus::types::Variant> wireless_conf; |
503 | - wireless_conf["ssid"] = dbus::types::Variant::encode<std::vector<std::int8_t>>(ap->get_ap().ssid->get()); |
504 | + wireless_conf["ssid"] = dbus::types::Variant::encode<std::vector<std::int8_t>>(ap->raw_ssid()); |
505 | |
506 | conf["802-11-wireless"] = wireless_conf; |
507 | auto ret = p->nm.add_and_activate_connection(conf, |
508 | |
509 | === modified file 'src/indicator/CMakeLists.txt' |
510 | --- src/indicator/CMakeLists.txt 2014-08-19 21:03:04 +0000 |
511 | +++ src/indicator/CMakeLists.txt 2014-10-31 14:07:40 +0000 |
512 | @@ -7,19 +7,18 @@ |
513 | service.h |
514 | indicator-menu.h |
515 | modem.cpp |
516 | - modem.h |
517 | modem-manager.cpp |
518 | quick-access-section.cpp |
519 | sim-unlock-dialog.cpp |
520 | root-state.cpp |
521 | - wifi-link-item.h |
522 | + wifi-link-item.cpp |
523 | wifi-section.cpp |
524 | wwan-link-item.cpp |
525 | wwan-section.cpp |
526 | |
527 | connectivity-service/connectivity-service.cpp |
528 | |
529 | - menuitems/access-point-item.h |
530 | + menuitems/access-point-item.cpp |
531 | menuitems/item.h |
532 | menuitems/modem-info-item.cpp |
533 | menuitems/section.h |
534 | |
535 | === modified file 'src/indicator/connectivity-service/connectivity-service.cpp' |
536 | --- src/indicator/connectivity-service/connectivity-service.cpp 2014-09-12 10:51:35 +0000 |
537 | +++ src/indicator/connectivity-service/connectivity-service.cpp 2014-10-31 14:07:40 +0000 |
538 | @@ -20,6 +20,8 @@ |
539 | #include "connectivity-service.h" |
540 | #include <dbus-cpp/services/connectivity.h> |
541 | |
542 | +#include <menumodel-cpp/gio-helpers/util.h> |
543 | + |
544 | #include <core/dbus/asio/executor.h> |
545 | #include <core/dbus/helper/type_mapper.h> |
546 | |
547 | @@ -81,7 +83,7 @@ |
548 | }; |
549 | } |
550 | |
551 | -class ConnectivityService::Private |
552 | +class ConnectivityService::Private : public std::enable_shared_from_this<Private> |
553 | { |
554 | public: |
555 | std::thread m_connectivityServiceWorker; |
556 | @@ -105,6 +107,7 @@ |
557 | |
558 | Private() = delete; |
559 | Private(std::shared_ptr<networking::Manager> manager); |
560 | + void ConstructL(); |
561 | ~Private(); |
562 | |
563 | void updateNetworkingStatus(); |
564 | @@ -114,9 +117,18 @@ |
565 | |
566 | ConnectivityService::Private::Private(std::shared_ptr<networking::Manager> manager) |
567 | : m_manager{manager} |
568 | +{} |
569 | + |
570 | +void |
571 | +ConnectivityService::Private::ConstructL() |
572 | { |
573 | - m_manager->characteristics().changed().connect(std::bind(&Private::updateNetworkingStatus, this)); |
574 | - m_manager->status().changed().connect(std::bind(&Private::updateNetworkingStatus, this)); |
575 | + auto that = shared_from_this(); |
576 | + m_manager->characteristics().changed().connect( |
577 | + [that](int){ GMainLoopDispatch([that](){ that->updateNetworkingStatus(); }); }); |
578 | + |
579 | + typedef connectivity::networking::Manager::NetworkingStatus NetworkingStatus; |
580 | + m_manager->status().changed().connect( |
581 | + [that](NetworkingStatus){ GMainLoopDispatch([that](){ that->updateNetworkingStatus(); }); }); |
582 | |
583 | m_bus = std::make_shared<core::dbus::Bus>(core::dbus::WellKnownBus::session); |
584 | |
585 | @@ -185,7 +197,9 @@ |
586 | { |
587 | auto reply = core::dbus::Message::make_method_return(msg); |
588 | m_bus->send(reply); |
589 | - m_unlockAllModems(); |
590 | + |
591 | + auto that = shared_from_this(); |
592 | + GMainLoopDispatch([that](){ that->m_unlockAllModems(); }); |
593 | }); |
594 | } |
595 | |
596 | @@ -306,7 +320,9 @@ |
597 | |
598 | ConnectivityService::ConnectivityService(std::shared_ptr<networking::Manager> manager) |
599 | : d{new Private(manager)} |
600 | -{} |
601 | +{ |
602 | + d->ConstructL(); |
603 | +} |
604 | |
605 | ConnectivityService::~ConnectivityService() |
606 | {} |
607 | |
608 | === modified file 'src/indicator/connectivity-service/connectivity-service.h' |
609 | --- src/indicator/connectivity-service/connectivity-service.h 2014-08-07 23:00:39 +0000 |
610 | +++ src/indicator/connectivity-service/connectivity-service.h 2014-10-31 14:07:40 +0000 |
611 | @@ -29,11 +29,14 @@ |
612 | ConnectivityService(std::shared_ptr<connectivity::networking::Manager> manager); |
613 | virtual ~ConnectivityService(); |
614 | |
615 | + /** |
616 | + * synced with GMainLoop |
617 | + */ |
618 | core::Signal<> &unlockAllModems(); |
619 | |
620 | private: |
621 | class Private; |
622 | - std::unique_ptr<Private> d; |
623 | + std::shared_ptr<Private> d; |
624 | }; |
625 | |
626 | #endif |
627 | |
628 | === modified file 'src/indicator/indicator-network-service.cpp' |
629 | --- src/indicator/indicator-network-service.cpp 2014-08-15 11:52:50 +0000 |
630 | +++ src/indicator/indicator-network-service.cpp 2014-10-31 14:07:40 +0000 |
631 | @@ -86,6 +86,8 @@ |
632 | |
633 | std::shared_ptr<Service> menu {new Service(manager)}; |
634 | std::unique_ptr<ConnectivityService> connectivityService {new ConnectivityService(manager)}; |
635 | + |
636 | + // unlockAllModems is dispatched from GMainLoop |
637 | connectivityService->unlockAllModems().connect([menu](){ menu->unlockAllModems(); }); |
638 | |
639 | if (getenv("VALGRIND") != 0) { |
640 | |
641 | === renamed file 'src/indicator/menuitems/access-point-item.h' => 'src/indicator/menuitems/access-point-item.cpp' |
642 | --- src/indicator/menuitems/access-point-item.h 2014-08-15 11:49:44 +0000 |
643 | +++ src/indicator/menuitems/access-point-item.cpp 2014-10-31 14:07:40 +0000 |
644 | @@ -17,32 +17,42 @@ |
645 | * Antti Kaijanmäki <antti.kaijanmaki@canonical.com> |
646 | */ |
647 | |
648 | -#ifndef ACCESS_POINT_ITEM_H |
649 | -#define ACCESS_POINT_ITEM_H |
650 | +#include "access-point-item.h" |
651 | |
652 | -#include "item.h" |
653 | #include "menumodel-cpp/action.h" |
654 | #include "menumodel-cpp/menu-item.h" |
655 | #include "menumodel-cpp/gio-helpers/variant.h" |
656 | |
657 | -#include <core/signal.h> |
658 | - |
659 | -#include <connectivity/networking/wifi/access-point.h> |
660 | namespace networking = connectivity::networking; |
661 | |
662 | #include <functional> |
663 | #include <vector> |
664 | |
665 | -class AccessPointItem : public Item |
666 | +class AccessPointItem::Private : public std::enable_shared_from_this<Private> |
667 | { |
668 | - |
669 | public: |
670 | - typedef std::shared_ptr<AccessPointItem> Ptr; |
671 | - |
672 | - AccessPointItem() = delete; |
673 | - explicit AccessPointItem(networking::wifi::AccessPoint::Ptr accessPoint, bool isActive = false) |
674 | - : m_accessPoint{accessPoint}, |
675 | + AccessPointItem *q; |
676 | + |
677 | + networking::wifi::AccessPoint::Ptr m_accessPoint; |
678 | + bool m_isActive; |
679 | + |
680 | + core::Signal<void> m_activated; |
681 | + |
682 | + std::vector<core::Connection> m_connections; |
683 | + |
684 | + Action::Ptr m_actionActivate; |
685 | + Action::Ptr m_actionStrength; |
686 | + MenuItem::Ptr m_item; |
687 | + |
688 | + |
689 | + Private() = delete; |
690 | + explicit Private(AccessPointItem *parent, networking::wifi::AccessPoint::Ptr accessPoint, bool isActive = false) |
691 | + : q{parent}, |
692 | + m_accessPoint{accessPoint}, |
693 | m_isActive{isActive} |
694 | + {} |
695 | + |
696 | + void ConstructL() |
697 | { |
698 | static int id = 0; |
699 | ++id; /// @todo guard me. |
700 | @@ -64,9 +74,17 @@ |
701 | nullptr, |
702 | TypedVariant<std::uint8_t>(m_accessPoint->strength().get())); |
703 | |
704 | - auto con = m_accessPoint->strength().changed().connect(std::bind(&AccessPointItem::setStrength, |
705 | - this, |
706 | - std::placeholders::_1)); |
707 | + auto weak = std::weak_ptr<Private>(shared_from_this()); |
708 | + auto con = m_accessPoint->strength().changed().connect([weak](double value) |
709 | + { |
710 | + auto that = weak.lock(); |
711 | + if (!that) |
712 | + return; |
713 | + GMainLoopDispatch([that, value]() |
714 | + { |
715 | + that->setStrength(value); |
716 | + }); |
717 | + }); |
718 | m_connections.push_back(con); |
719 | |
720 | m_actionActivate = std::make_shared<Action>(actionId, |
721 | @@ -79,11 +97,11 @@ |
722 | m_activated(); |
723 | }); |
724 | |
725 | - m_actionGroup->add(m_actionActivate); |
726 | - m_actionGroup->add(m_actionStrength); |
727 | + q->actionGroup()->add(m_actionActivate); |
728 | + q->actionGroup()->add(m_actionStrength); |
729 | } |
730 | |
731 | - virtual ~AccessPointItem() |
732 | + virtual ~Private() |
733 | { |
734 | for (auto con : m_connections) |
735 | con.disconnect(); |
736 | @@ -94,35 +112,32 @@ |
737 | /// @todo narrow_cast<>; |
738 | m_actionStrength->setState(TypedVariant<std::uint8_t>(value)); |
739 | } |
740 | - |
741 | - void setActive(bool value) |
742 | - { |
743 | - m_isActive = value; |
744 | - m_actionActivate->setState(TypedVariant<bool>(m_isActive)); |
745 | - } |
746 | - |
747 | - virtual MenuItem::Ptr |
748 | - menuItem() |
749 | - { |
750 | - return m_item; |
751 | - } |
752 | - |
753 | - core::Signal<void> &activated() |
754 | - { |
755 | - return m_activated; |
756 | - } |
757 | - |
758 | -private: |
759 | - networking::wifi::AccessPoint::Ptr m_accessPoint; |
760 | - bool m_isActive; |
761 | - |
762 | - core::Signal<void> m_activated; |
763 | - |
764 | - std::vector<core::Connection> m_connections; |
765 | - |
766 | - Action::Ptr m_actionActivate; |
767 | - Action::Ptr m_actionStrength; |
768 | - MenuItem::Ptr m_item; |
769 | }; |
770 | |
771 | -#endif // ACCESS_POINT_ITEM_H |
772 | +AccessPointItem::AccessPointItem(networking::wifi::AccessPoint::Ptr accessPoint, bool isActive) |
773 | + : d{new Private(this, accessPoint, isActive)} |
774 | +{ |
775 | + d->ConstructL(); |
776 | +} |
777 | + |
778 | +AccessPointItem::~AccessPointItem() |
779 | +{} |
780 | + |
781 | +void |
782 | +AccessPointItem::setActive(bool value) |
783 | +{ |
784 | + d->m_isActive = value; |
785 | + d->m_actionActivate->setState(TypedVariant<bool>(d->m_isActive)); |
786 | +} |
787 | + |
788 | +MenuItem::Ptr |
789 | +AccessPointItem::menuItem() |
790 | +{ |
791 | + return d->m_item; |
792 | +} |
793 | + |
794 | +core::Signal<void> & |
795 | +AccessPointItem::activated() |
796 | +{ |
797 | + return d->m_activated; |
798 | +} |
799 | |
800 | === added file 'src/indicator/menuitems/access-point-item.h' |
801 | --- src/indicator/menuitems/access-point-item.h 1970-01-01 00:00:00 +0000 |
802 | +++ src/indicator/menuitems/access-point-item.h 2014-10-31 14:07:40 +0000 |
803 | @@ -0,0 +1,44 @@ |
804 | +/* |
805 | + * Copyright (C) 2014 Canonical, Ltd. |
806 | + * |
807 | + * This program is free software: you can redistribute it and/or modify it |
808 | + * under the terms of the GNU General Public License version 3, as published |
809 | + * by the Free Software Foundation. |
810 | + * |
811 | + * This program is distributed in the hope that it will be useful, but |
812 | + * WITHOUT ANY WARRANTY; without even the implied warranties of |
813 | + * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR |
814 | + * PURPOSE. See the GNU General Public License for more details. |
815 | + * |
816 | + * You should have received a copy of the GNU General Public License along |
817 | + * with this program. If not, see <http://www.gnu.org/licenses/>. |
818 | + * |
819 | + * Authors: |
820 | + * Antti Kaijanmäki <antti.kaijanmaki@canonical.com> |
821 | + */ |
822 | + |
823 | +#ifndef ACCESS_POINT_ITEM_H |
824 | +#define ACCESS_POINT_ITEM_H |
825 | + |
826 | +#include <connectivity/networking/wifi/access-point.h> |
827 | +#include "item.h" |
828 | + |
829 | +class AccessPointItem : public Item |
830 | +{ |
831 | + class Private; |
832 | + std::shared_ptr<Private> d; |
833 | + |
834 | +public: |
835 | + typedef std::shared_ptr<AccessPointItem> Ptr; |
836 | + |
837 | + AccessPointItem() = delete; |
838 | + explicit AccessPointItem(connectivity::networking::wifi::AccessPoint::Ptr accessPoint, bool isActive = false); |
839 | + virtual ~AccessPointItem(); |
840 | + |
841 | + void setActive(bool value); |
842 | + |
843 | + virtual MenuItem::Ptr menuItem(); |
844 | + core::Signal<void> &activated(); |
845 | +}; |
846 | + |
847 | +#endif // ACCESS_POINT_ITEM_H |
848 | |
849 | === modified file 'src/indicator/modem-manager.cpp' |
850 | --- src/indicator/modem-manager.cpp 2014-10-15 11:31:13 +0000 |
851 | +++ src/indicator/modem-manager.cpp 2014-10-31 14:07:40 +0000 |
852 | @@ -19,6 +19,8 @@ |
853 | |
854 | #include "modem-manager.h" |
855 | |
856 | +#include <menumodel-cpp/gio-helpers/util.h> |
857 | + |
858 | #include <notify-cpp/snapdecision/sim-unlock.h> |
859 | |
860 | #include "dbus-cpp/services/ofono.h" |
861 | @@ -30,7 +32,7 @@ |
862 | |
863 | #include "sim-unlock-dialog.h" |
864 | |
865 | -class ModemManager::Private |
866 | +class ModemManager::Private : public std::enable_shared_from_this<Private> |
867 | { |
868 | public: |
869 | |
870 | @@ -47,6 +49,10 @@ |
871 | std::list<Modem::Ptr> m_pendingUnlocks; |
872 | |
873 | Private() |
874 | + {} |
875 | + |
876 | + void |
877 | + ConstructL() |
878 | { |
879 | m_bus = std::make_shared<core::dbus::Bus>(core::dbus::WellKnownBus::system); |
880 | |
881 | @@ -83,8 +89,10 @@ |
882 | ofono_disappeared(); |
883 | } |
884 | m_watcher = m_dbus->make_service_watcher(org::ofono::Service::name()); |
885 | - m_watcher->service_registered().connect([this]() { ofono_appeared(); }); |
886 | - m_watcher->service_unregistered().connect([this](){ ofono_disappeared(); }); |
887 | + |
888 | + auto that = shared_from_this(); |
889 | + m_watcher->service_registered().connect([that](){ GMainLoopDispatch([that](){ that->ofono_appeared(); }); }); |
890 | + m_watcher->service_unregistered().connect([that](){ GMainLoopDispatch([that](){ that->ofono_disappeared(); }); }); |
891 | } |
892 | |
893 | ~Private() |
894 | @@ -109,7 +117,10 @@ |
895 | std::cerr << e.what() << std::endl; |
896 | } |
897 | |
898 | - m_ofono->manager->modems.changed().connect(std::bind(&Private::modems_changed, this, std::placeholders::_1)); |
899 | + auto that = shared_from_this(); |
900 | + m_ofono->manager->modems.changed().connect( |
901 | + [that](std::map<core::dbus::types::ObjectPath, org::ofono::Interface::Modem::Ptr> modems) |
902 | + { GMainLoopDispatch([that, modems]() { that->modems_changed(modems); }); }); |
903 | modems_changed(m_ofono->manager->modems.get()); |
904 | } |
905 | |
906 | @@ -171,8 +182,9 @@ |
907 | }; |
908 | |
909 | ModemManager::ModemManager() |
910 | + : d{new Private} |
911 | { |
912 | - d.reset(new Private); |
913 | + d->ConstructL(); |
914 | } |
915 | |
916 | ModemManager::~ModemManager() |
917 | |
918 | === modified file 'src/indicator/modem-manager.h' |
919 | --- src/indicator/modem-manager.h 2014-08-07 20:24:48 +0000 |
920 | +++ src/indicator/modem-manager.h 2014-10-31 14:07:40 +0000 |
921 | @@ -28,7 +28,7 @@ |
922 | class ModemManager |
923 | { |
924 | class Private; |
925 | - std::unique_ptr<Private> d; |
926 | + std::shared_ptr<Private> d; |
927 | |
928 | public: |
929 | |
930 | @@ -37,9 +37,19 @@ |
931 | ModemManager(); |
932 | ~ModemManager(); |
933 | |
934 | + /** |
935 | + * must be called from GMainLoop |
936 | + */ |
937 | void unlockModem(Modem::Ptr modem); |
938 | + |
939 | + /** |
940 | + * must be called from GMainLoop |
941 | + */ |
942 | void unlockAllModems(); |
943 | |
944 | + /** |
945 | + * changed() emitted from GMainLoop |
946 | + */ |
947 | const core::Property<std::set<Modem::Ptr>> &modems(); |
948 | }; |
949 | |
950 | |
951 | === modified file 'src/indicator/modem.cpp' |
952 | --- src/indicator/modem.cpp 2014-10-08 09:45:57 +0000 |
953 | +++ src/indicator/modem.cpp 2014-10-31 14:07:40 +0000 |
954 | @@ -19,7 +19,9 @@ |
955 | |
956 | #include "modem.h" |
957 | |
958 | -class Modem::Private |
959 | +#include <menumodel-cpp/gio-helpers/util.h> |
960 | + |
961 | +class Modem::Private : public std::enable_shared_from_this<Private> |
962 | { |
963 | public: |
964 | core::Property<bool> m_online; |
965 | @@ -41,8 +43,60 @@ |
966 | void simManagerChanged(org::ofono::Interface::SimManager::Ptr simmgr); |
967 | |
968 | void update(); |
969 | + |
970 | + Private() = delete; |
971 | + Private(org::ofono::Interface::Modem::Ptr ofonoModem); |
972 | + void ConstructL(); |
973 | }; |
974 | |
975 | +Modem::Private::Private(org::ofono::Interface::Modem::Ptr ofonoModem) |
976 | + : m_ofonoModem{ofonoModem} |
977 | +{} |
978 | + |
979 | +void |
980 | +Modem::Private::ConstructL() |
981 | +{ |
982 | + auto that = shared_from_this(); |
983 | + |
984 | + m_online.set(m_ofonoModem->online.get()); |
985 | + m_ofonoModem->online.changed().connect([that](bool value){ |
986 | + GMainLoopDispatch([that, value]() { |
987 | + that->m_online.set(value); |
988 | + }); |
989 | + }); |
990 | + |
991 | + simManagerChanged(m_ofonoModem->simManager.get()); |
992 | + m_ofonoModem->simManager.changed().connect([that](org::ofono::Interface::SimManager::Ptr simmgr) |
993 | + { |
994 | + GMainLoopDispatch([that, simmgr](){ |
995 | + that->simManagerChanged(simmgr); |
996 | + }); |
997 | + }); |
998 | + |
999 | + networkRegistrationChanged(m_ofonoModem->networkRegistration.get()); |
1000 | + m_ofonoModem->networkRegistration.changed().connect([that](org::ofono::Interface::NetworkRegistration::Ptr netreg) |
1001 | + { |
1002 | + GMainLoopDispatch([that, netreg](){ |
1003 | + that->networkRegistrationChanged(netreg); |
1004 | + }); |
1005 | + }); |
1006 | + |
1007 | + /// @todo hook up with system-settings to allow changing the identifier. |
1008 | + /// for now just provide the defaults |
1009 | + const auto path = m_ofonoModem->object->path().as_string(); |
1010 | + if (path == "/ril_0") { |
1011 | + m_simIdentifier.set("SIM 1"); |
1012 | + m_index = 1; |
1013 | + } else if (path == "/ril_1") { |
1014 | + m_simIdentifier.set("SIM 2"); |
1015 | + m_index = 2; |
1016 | + } else { |
1017 | + m_simIdentifier.set(path); |
1018 | + } |
1019 | + |
1020 | +} |
1021 | + |
1022 | + |
1023 | void |
1024 | Modem::Private::update() |
1025 | { |
1026 | @@ -119,10 +173,38 @@ |
1027 | Modem::Private::networkRegistrationChanged(org::ofono::Interface::NetworkRegistration::Ptr netreg) |
1028 | { |
1029 | if (netreg) { |
1030 | - netreg->operatorName.changed().connect(std::bind(&Private::update, this)); |
1031 | - netreg->status.changed().connect(std::bind(&Private::update, this)); |
1032 | - netreg->strength.changed().connect(std::bind(&Private::update, this)); |
1033 | - netreg->technology.changed().connect(std::bind(&Private::update, this)); |
1034 | + auto that = shared_from_this(); |
1035 | + netreg->operatorName.changed().connect([that](const std::string &) |
1036 | + { |
1037 | + GMainLoopDispatch([that]() |
1038 | + { |
1039 | + that->update(); |
1040 | + }); |
1041 | + }); |
1042 | + netreg->status.changed().connect([that](org::ofono::Interface::NetworkRegistration::Status) |
1043 | + { |
1044 | + GMainLoopDispatch([that]() |
1045 | + { |
1046 | + that->update(); |
1047 | + }); |
1048 | + }); |
1049 | + |
1050 | + netreg->strength.changed().connect([that](std::int8_t) |
1051 | + { |
1052 | + GMainLoopDispatch([that]() |
1053 | + { |
1054 | + that->update(); |
1055 | + }); |
1056 | + }); |
1057 | + |
1058 | + netreg->technology.changed().connect([that](org::ofono::Interface::NetworkRegistration::Technology) |
1059 | + { |
1060 | + GMainLoopDispatch([that]() |
1061 | + { |
1062 | + that->update(); |
1063 | + }); |
1064 | + }); |
1065 | + |
1066 | } |
1067 | update(); |
1068 | } |
1069 | @@ -132,41 +214,39 @@ |
1070 | Modem::Private::simManagerChanged(org::ofono::Interface::SimManager::Ptr simmgr) |
1071 | { |
1072 | if (simmgr) { |
1073 | - simmgr->present.changed().connect(std::bind(&Private::update, this)); |
1074 | - simmgr->pinRequired.changed().connect(std::bind(&Private::update, this)); |
1075 | - simmgr->retries.changed().connect(std::bind(&Private::update, this)); |
1076 | + auto that = shared_from_this(); |
1077 | + simmgr->present.changed().connect([that](bool) |
1078 | + { |
1079 | + GMainLoopDispatch([that]() |
1080 | + { |
1081 | + that->update(); |
1082 | + }); |
1083 | + }); |
1084 | + |
1085 | + simmgr->pinRequired.changed().connect([that](org::ofono::Interface::SimManager::PinType) |
1086 | + { |
1087 | + GMainLoopDispatch([that]() |
1088 | + { |
1089 | + that->update(); |
1090 | + }); |
1091 | + }); |
1092 | + |
1093 | + simmgr->retries.changed().connect([that](std::map<org::ofono::Interface::SimManager::PinType, std::uint8_t>) |
1094 | + { |
1095 | + GMainLoopDispatch([that]() |
1096 | + { |
1097 | + that->update(); |
1098 | + }); |
1099 | + }); |
1100 | + |
1101 | } |
1102 | update(); |
1103 | } |
1104 | |
1105 | Modem::Modem(org::ofono::Interface::Modem::Ptr ofonoModem) |
1106 | + : d{new Private(ofonoModem)} |
1107 | { |
1108 | - d.reset(new Private); |
1109 | - d->m_ofonoModem = ofonoModem; |
1110 | - |
1111 | - d->m_online.set(d->m_ofonoModem->online.get()); |
1112 | - d->m_ofonoModem->online.changed().connect([this](bool value){ |
1113 | - d->m_online.set(value); |
1114 | - }); |
1115 | - |
1116 | - d->simManagerChanged(d->m_ofonoModem->simManager.get()); |
1117 | - d->m_ofonoModem->simManager.changed().connect(std::bind(&Private::simManagerChanged, d.get(), std::placeholders::_1)); |
1118 | - |
1119 | - d->networkRegistrationChanged(d->m_ofonoModem->networkRegistration.get()); |
1120 | - d->m_ofonoModem->networkRegistration.changed().connect(std::bind(&Private::networkRegistrationChanged, d.get(), std::placeholders::_1)); |
1121 | - |
1122 | - /// @todo hook up with system-settings to allow changing the identifier. |
1123 | - /// for now just provide the defaults |
1124 | - const auto path = ofonoModem->object->path().as_string(); |
1125 | - if (path == "/ril_0") { |
1126 | - d->m_simIdentifier.set("SIM 1"); |
1127 | - d->m_index = 1; |
1128 | - } else if (path == "/ril_1") { |
1129 | - d->m_simIdentifier.set("SIM 2"); |
1130 | - d->m_index = 2; |
1131 | - } else { |
1132 | - d->m_simIdentifier.set(path); |
1133 | - } |
1134 | + d->ConstructL(); |
1135 | } |
1136 | |
1137 | Modem::~Modem() |
1138 | |
1139 | === modified file 'src/indicator/modem.h' |
1140 | --- src/indicator/modem.h 2014-10-02 11:36:00 +0000 |
1141 | +++ src/indicator/modem.h 2014-10-31 14:07:40 +0000 |
1142 | @@ -27,10 +27,13 @@ |
1143 | |
1144 | #include "dbus-cpp/services/ofono.h" |
1145 | |
1146 | +/** |
1147 | + * all signals and property changes emitted from GMainLoop |
1148 | + */ |
1149 | class Modem |
1150 | { |
1151 | class Private; |
1152 | - std::unique_ptr<Private> d; |
1153 | + std::shared_ptr<Private> d; |
1154 | |
1155 | public: |
1156 | enum class PinType |
1157 | |
1158 | === modified file 'src/indicator/quick-access-section.cpp' |
1159 | --- src/indicator/quick-access-section.cpp 2014-10-09 10:58:30 +0000 |
1160 | +++ src/indicator/quick-access-section.cpp 2014-10-31 14:07:40 +0000 |
1161 | @@ -26,7 +26,7 @@ |
1162 | |
1163 | namespace networking = connectivity::networking; |
1164 | |
1165 | -class QuickAccessSection::Private |
1166 | +class QuickAccessSection::Private : public std::enable_shared_from_this<Private> |
1167 | { |
1168 | public: |
1169 | ActionGroupMerger::Ptr m_actionGroupMerger; |
1170 | @@ -36,15 +36,23 @@ |
1171 | |
1172 | SwitchItem::Ptr m_flightModeSwitch; |
1173 | |
1174 | + Private() = delete; |
1175 | Private(std::shared_ptr<networking::Manager> manager); |
1176 | + void ConstructL(); |
1177 | }; |
1178 | |
1179 | QuickAccessSection::Private::Private(std::shared_ptr<networking::Manager> manager) |
1180 | : m_manager{manager} |
1181 | +{} |
1182 | + |
1183 | +void |
1184 | +QuickAccessSection::Private::ConstructL() |
1185 | { |
1186 | m_actionGroupMerger = std::make_shared<ActionGroupMerger>(); |
1187 | m_menu = std::make_shared<Menu>(); |
1188 | |
1189 | + auto that = shared_from_this(); |
1190 | + |
1191 | m_flightModeSwitch = std::make_shared<SwitchItem>(_("Flight Mode"), "airplane", "enabled"); |
1192 | switch (m_manager->flightMode().get()) { |
1193 | case networking::Manager::FlightModeStatus::off: |
1194 | @@ -54,15 +62,18 @@ |
1195 | m_flightModeSwitch->state().set(true); |
1196 | break; |
1197 | } |
1198 | - m_manager->flightMode().changed().connect([this](networking::Manager::FlightModeStatus value){ |
1199 | - switch (value) { |
1200 | - case networking::Manager::FlightModeStatus::off: |
1201 | - m_flightModeSwitch->state().set(false); |
1202 | - break; |
1203 | - case networking::Manager::FlightModeStatus::on: |
1204 | - m_flightModeSwitch->state().set(true); |
1205 | - break; |
1206 | - } |
1207 | + m_manager->flightMode().changed().connect([that](networking::Manager::FlightModeStatus value){ |
1208 | + GMainLoopDispatch([that, value] |
1209 | + { |
1210 | + switch (value) { |
1211 | + case networking::Manager::FlightModeStatus::off: |
1212 | + that->m_flightModeSwitch->state().set(false); |
1213 | + break; |
1214 | + case networking::Manager::FlightModeStatus::on: |
1215 | + that->m_flightModeSwitch->state().set(true); |
1216 | + break; |
1217 | + } |
1218 | + }); |
1219 | }); |
1220 | m_flightModeSwitch->activated().connect([this](){ |
1221 | if (m_flightModeSwitch->state().get()) { |
1222 | @@ -85,8 +96,9 @@ |
1223 | } |
1224 | |
1225 | QuickAccessSection::QuickAccessSection(std::shared_ptr<networking::Manager> manager) |
1226 | + : d{new Private(manager)} |
1227 | { |
1228 | - d.reset(new Private(manager)); |
1229 | + d->ConstructL(); |
1230 | } |
1231 | |
1232 | QuickAccessSection::~QuickAccessSection() |
1233 | |
1234 | === modified file 'src/indicator/quick-access-section.h' |
1235 | --- src/indicator/quick-access-section.h 2014-04-23 14:41:46 +0000 |
1236 | +++ src/indicator/quick-access-section.h 2014-10-31 14:07:40 +0000 |
1237 | @@ -23,10 +23,13 @@ |
1238 | #include "menuitems/section.h" |
1239 | #include <connectivity/networking/manager.h> |
1240 | |
1241 | +/** |
1242 | + * all signals and property changes emitted from GMainLoop |
1243 | + */ |
1244 | class QuickAccessSection : public Section |
1245 | { |
1246 | class Private; |
1247 | - std::unique_ptr<Private> d; |
1248 | + std::shared_ptr<Private> d; |
1249 | |
1250 | public: |
1251 | typedef std::shared_ptr<QuickAccessSection> Ptr; |
1252 | |
1253 | === modified file 'src/indicator/root-state.cpp' |
1254 | --- src/indicator/root-state.cpp 2014-10-06 08:30:34 +0000 |
1255 | +++ src/indicator/root-state.cpp 2014-10-31 14:07:40 +0000 |
1256 | @@ -24,9 +24,11 @@ |
1257 | #include <connectivity/networking/wifi/link.h> |
1258 | #include <connectivity/networking/wifi/access-point.h> |
1259 | |
1260 | +#include <menumodel-cpp/gio-helpers/util.h> |
1261 | + |
1262 | namespace networking = connectivity::networking; |
1263 | |
1264 | -class RootState::Private |
1265 | +class RootState::Private : public std::enable_shared_from_this<Private> |
1266 | { |
1267 | public: |
1268 | std::shared_ptr<networking::Manager> m_manager; |
1269 | @@ -43,6 +45,7 @@ |
1270 | |
1271 | Private() = delete; |
1272 | Private(std::shared_ptr<networking::Manager> manager, ModemManager::Ptr modemManager); |
1273 | + void ConstructL(); |
1274 | |
1275 | void modemsChanged(const std::set<Modem::Ptr> &modems); |
1276 | |
1277 | @@ -57,14 +60,38 @@ |
1278 | RootState::Private::Private(std::shared_ptr<networking::Manager> manager, ModemManager::Ptr modemManager) |
1279 | : m_manager{manager}, |
1280 | m_modemManager{modemManager} |
1281 | -{ |
1282 | - m_manager->flightMode().changed().connect(std::bind(&Private::updateRootState, this)); |
1283 | - |
1284 | +{} |
1285 | + |
1286 | +void |
1287 | +RootState::Private::ConstructL() |
1288 | +{ |
1289 | + auto that = shared_from_this(); |
1290 | + |
1291 | + m_manager->flightMode().changed().connect([that](connectivity::networking::Manager::FlightModeStatus) |
1292 | + { |
1293 | + GMainLoopDispatch([that](){ |
1294 | + that->updateRootState(); |
1295 | + }); |
1296 | + }); |
1297 | + |
1298 | + modemsChanged(m_modemManager->modems().get()); |
1299 | + // modem properties and signals already synced with GMainLoop |
1300 | m_modemManager->modems().changed().connect(std::bind(&Private::modemsChanged, this, std::placeholders::_1)); |
1301 | - modemsChanged(m_modemManager->modems().get()); |
1302 | - |
1303 | - m_manager->status().changed().connect(std::bind(&Private::updateNetworkingIcon, this)); |
1304 | - m_manager->links().changed().connect(std::bind(&Private::updateNetworkingIcon, this)); |
1305 | + |
1306 | + m_manager->status().changed().connect([that](connectivity::networking::Manager::NetworkingStatus) |
1307 | + { |
1308 | + GMainLoopDispatch([that](){ |
1309 | + that->updateNetworkingIcon(); |
1310 | + }); |
1311 | + }); |
1312 | + |
1313 | + m_manager->links().changed().connect([that](std::set<connectivity::networking::Link::Ptr>) |
1314 | + { |
1315 | + GMainLoopDispatch([that](){ |
1316 | + that->updateNetworkingIcon(); |
1317 | + }); |
1318 | + }); |
1319 | + |
1320 | |
1321 | // will also call updateRootState() |
1322 | updateNetworkingIcon(); |
1323 | @@ -90,6 +117,7 @@ |
1324 | m_cellularIcons.erase(modem); |
1325 | |
1326 | for (auto modem : added) { |
1327 | + // modem properties and signals already synced with GMainLoop |
1328 | modem->online().changed().connect(std::bind(&Private::updateModem, this, Modem::WeakPtr(modem))); |
1329 | modem->simStatus().changed().connect(std::bind(&Private::updateModem, this, Modem::WeakPtr(modem))); |
1330 | modem->status().changed().connect(std::bind(&Private::updateModem, this, Modem::WeakPtr(modem))); |
1331 | @@ -319,8 +347,9 @@ |
1332 | } |
1333 | |
1334 | RootState::RootState(std::shared_ptr<connectivity::networking::Manager> manager, ModemManager::Ptr modemManager) |
1335 | + : d{new Private(manager, modemManager)} |
1336 | { |
1337 | - d.reset(new Private(manager, modemManager)); |
1338 | + d->ConstructL(); |
1339 | } |
1340 | |
1341 | RootState::~RootState() |
1342 | |
1343 | === modified file 'src/indicator/root-state.h' |
1344 | --- src/indicator/root-state.h 2014-05-12 11:36:59 +0000 |
1345 | +++ src/indicator/root-state.h 2014-10-31 14:07:40 +0000 |
1346 | @@ -25,10 +25,13 @@ |
1347 | |
1348 | #include "menumodel-cpp/gio-helpers/variant.h" |
1349 | |
1350 | +/** |
1351 | + * all signals and property changes emitted from GMainLoop |
1352 | + */ |
1353 | class RootState |
1354 | { |
1355 | class Private; |
1356 | - std::unique_ptr<Private> d; |
1357 | + std::shared_ptr<Private> d; |
1358 | |
1359 | public: |
1360 | typedef std::shared_ptr<RootState> Ptr; |
1361 | |
1362 | === modified file 'src/indicator/sim-unlock-dialog.h' |
1363 | --- src/indicator/sim-unlock-dialog.h 2014-10-14 19:54:51 +0000 |
1364 | +++ src/indicator/sim-unlock-dialog.h 2014-10-31 14:07:40 +0000 |
1365 | @@ -23,6 +23,9 @@ |
1366 | #include <memory> |
1367 | #include "modem.h" |
1368 | |
1369 | +/** |
1370 | + * all signals and property changes dispatched from GMainLoop |
1371 | + */ |
1372 | class SimUnlockDialog |
1373 | { |
1374 | class Private; |
1375 | |
1376 | === renamed file 'src/indicator/wifi-link-item.h' => 'src/indicator/wifi-link-item.cpp' |
1377 | --- src/indicator/wifi-link-item.h 2014-09-24 23:37:18 +0000 |
1378 | +++ src/indicator/wifi-link-item.cpp 2014-10-31 14:07:40 +0000 |
1379 | @@ -17,26 +17,26 @@ |
1380 | * Antti Kaijanmäki <antti.kaijanmaki@canonical.com> |
1381 | */ |
1382 | |
1383 | -#ifndef WIFI_LINK_ITEM_H |
1384 | -#define WIFI_LINK_ITEM_H |
1385 | +#include "wifi-link-item.h" |
1386 | |
1387 | -#include "menuitems/switch-item.h" |
1388 | +#include "menuitems/text-item.h" |
1389 | #include "menuitems/access-point-item.h" |
1390 | -#include "menuitems/text-item.h" |
1391 | |
1392 | #include "menumodel-cpp/action-group.h" |
1393 | #include "menumodel-cpp/action-group-merger.h" |
1394 | #include "menumodel-cpp/menu.h" |
1395 | #include "menumodel-cpp/menu-merger.h" |
1396 | |
1397 | -#include <connectivity/networking/wifi/link.h> |
1398 | namespace networking = connectivity::networking; |
1399 | |
1400 | #include <algorithm> |
1401 | #include <locale> |
1402 | |
1403 | -class WifiLinkItem : public Item |
1404 | +class WifiLinkItem::Private : public std::enable_shared_from_this<Private> |
1405 | { |
1406 | +public: |
1407 | + ActionGroupMerger::Ptr m_actionGroupMerger; |
1408 | + |
1409 | networking::wifi::Link::Ptr m_link; |
1410 | |
1411 | /// @todo do something with me... |
1412 | @@ -66,13 +66,18 @@ |
1413 | std::mutex m_updateActiveAccessPointMutex; |
1414 | |
1415 | public: |
1416 | - typedef std::shared_ptr<WifiLinkItem> Ptr; |
1417 | - |
1418 | - WifiLinkItem() = delete; |
1419 | - virtual ~WifiLinkItem() = default; |
1420 | - WifiLinkItem(networking::wifi::Link::Ptr link) |
1421 | + |
1422 | + |
1423 | + Private() = delete; |
1424 | + ~Private() {} |
1425 | + Private(networking::wifi::Link::Ptr link) |
1426 | : m_link {link} |
1427 | + {} |
1428 | + |
1429 | + void ConstructL() |
1430 | { |
1431 | + m_actionGroupMerger = std::make_shared<ActionGroupMerger>(); |
1432 | + |
1433 | m_topMenu = std::make_shared<Menu>(); |
1434 | |
1435 | m_connectedBeforeApsMenu = std::make_shared<Menu>(); |
1436 | @@ -103,14 +108,24 @@ |
1437 | return a_upper < b_upper; |
1438 | }; |
1439 | |
1440 | + auto that = shared_from_this(); |
1441 | + |
1442 | updateAccessPoints(m_link->accessPoints().get()); |
1443 | - m_link->accessPoints().changed().connect([this](std::set<networking::wifi::AccessPoint::Ptr> accessPoints){ |
1444 | - updateAccessPoints(accessPoints); |
1445 | + m_link->accessPoints().changed().connect([that](std::set<networking::wifi::AccessPoint::Ptr> accessPoints) |
1446 | + { |
1447 | + GMainLoopDispatch([that, accessPoints]() |
1448 | + { |
1449 | + that->updateAccessPoints(accessPoints); |
1450 | + }); |
1451 | }); |
1452 | |
1453 | updateActiveAccessPoint(m_link->activeAccessPoint().get()); |
1454 | - m_link->activeAccessPoint().changed().connect([this](networking::wifi::AccessPoint::Ptr ap){ |
1455 | - updateActiveAccessPoint(ap); |
1456 | + m_link->activeAccessPoint().changed().connect([that](networking::wifi::AccessPoint::Ptr ap) |
1457 | + { |
1458 | + GMainLoopDispatch([that, ap]() |
1459 | + { |
1460 | + that->updateActiveAccessPoint(ap); |
1461 | + }); |
1462 | }); |
1463 | |
1464 | m_otherNetwork = std::make_shared<TextItem>(_("Other network…"), "wifi", "othernetwork"); |
1465 | @@ -204,12 +219,26 @@ |
1466 | } |
1467 | } |
1468 | |
1469 | - virtual MenuItem::Ptr |
1470 | - menuItem() { |
1471 | - return m_item; |
1472 | - } |
1473 | - |
1474 | - |
1475 | }; |
1476 | |
1477 | -#endif // WIFI_LINK_ITEM_H |
1478 | + |
1479 | +WifiLinkItem::WifiLinkItem(connectivity::networking::wifi::Link::Ptr link) |
1480 | + : d{new Private(link)} |
1481 | +{ |
1482 | + d->ConstructL(); |
1483 | +} |
1484 | + |
1485 | +WifiLinkItem::~WifiLinkItem() |
1486 | +{} |
1487 | + |
1488 | +ActionGroup::Ptr |
1489 | +WifiLinkItem::actionGroup() |
1490 | +{ |
1491 | + return d->m_actionGroupMerger->actionGroup(); |
1492 | +} |
1493 | + |
1494 | +MenuItem::Ptr |
1495 | +WifiLinkItem::menuItem() |
1496 | +{ |
1497 | + return d->m_item; |
1498 | +} |
1499 | |
1500 | === added file 'src/indicator/wifi-link-item.h' |
1501 | --- src/indicator/wifi-link-item.h 1970-01-01 00:00:00 +0000 |
1502 | +++ src/indicator/wifi-link-item.h 2014-10-31 14:07:40 +0000 |
1503 | @@ -0,0 +1,43 @@ |
1504 | +/* |
1505 | + * Copyright (C) 2014 Canonical, Ltd. |
1506 | + * |
1507 | + * This program is free software: you can redistribute it and/or modify it |
1508 | + * under the terms of the GNU General Public License version 3, as published |
1509 | + * by the Free Software Foundation. |
1510 | + * |
1511 | + * This program is distributed in the hope that it will be useful, but |
1512 | + * WITHOUT ANY WARRANTY; without even the implied warranties of |
1513 | + * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR |
1514 | + * PURPOSE. See the GNU General Public License for more details. |
1515 | + * |
1516 | + * You should have received a copy of the GNU General Public License along |
1517 | + * with this program. If not, see <http://www.gnu.org/licenses/>. |
1518 | + * |
1519 | + * Authors: |
1520 | + * Antti Kaijanmäki <antti.kaijanmaki@canonical.com> |
1521 | + */ |
1522 | + |
1523 | +#ifndef WIFI_LINK_ITEM_H |
1524 | +#define WIFI_LINK_ITEM_H |
1525 | + |
1526 | +#include <connectivity/networking/wifi/link.h> |
1527 | + |
1528 | +#include "menuitems/item.h" |
1529 | + |
1530 | +class WifiLinkItem : public Item |
1531 | +{ |
1532 | + class Private; |
1533 | + std::shared_ptr<Private> d; |
1534 | + |
1535 | +public: |
1536 | + typedef std::shared_ptr<WifiLinkItem> Ptr; |
1537 | + |
1538 | + WifiLinkItem() = delete; |
1539 | + WifiLinkItem(connectivity::networking::wifi::Link::Ptr link); |
1540 | + virtual ~WifiLinkItem(); |
1541 | + |
1542 | + virtual MenuItem::Ptr menuItem(); |
1543 | + virtual ActionGroup::Ptr actionGroup(); |
1544 | +}; |
1545 | + |
1546 | +#endif // WIFI_LINK_ITEM_H |
1547 | |
1548 | === modified file 'src/indicator/wifi-section.cpp' |
1549 | --- src/indicator/wifi-section.cpp 2014-09-25 18:48:39 +0000 |
1550 | +++ src/indicator/wifi-section.cpp 2014-10-31 14:07:40 +0000 |
1551 | @@ -23,7 +23,17 @@ |
1552 | |
1553 | #include "url-dispatcher-cpp/url-dispatcher.h" |
1554 | |
1555 | -class WifiSection::Private |
1556 | +#include "menuitems/switch-item.h" |
1557 | +#include "menuitems/text-item.h" |
1558 | + |
1559 | +#include "menumodel-cpp/action-group.h" |
1560 | +#include "menumodel-cpp/action-group-merger.h" |
1561 | +#include "menumodel-cpp/menu.h" |
1562 | +#include "menumodel-cpp/menu-merger.h" |
1563 | + |
1564 | +using namespace connectivity; |
1565 | + |
1566 | +class WifiSection::Private : public std::enable_shared_from_this<Private> |
1567 | { |
1568 | public: |
1569 | std::shared_ptr<connectivity::networking::Manager> m_manager; |
1570 | @@ -40,6 +50,10 @@ |
1571 | Private() = delete; |
1572 | Private(std::shared_ptr<connectivity::networking::Manager> manager) |
1573 | : m_manager{manager} |
1574 | + {} |
1575 | + |
1576 | + void |
1577 | + ConstructL() |
1578 | { |
1579 | m_actionGroupMerger = std::make_shared<ActionGroupMerger>(); |
1580 | m_menu = std::make_shared<Menu>(); |
1581 | @@ -56,9 +70,14 @@ |
1582 | m_settingsMenu->append(*m_switch); |
1583 | } |
1584 | |
1585 | + auto that = shared_from_this(); |
1586 | + |
1587 | m_switch->state().set(m_manager->wifiEnabled().get()); |
1588 | - m_manager->wifiEnabled().changed().connect([this](bool value) { |
1589 | - m_switch->state().set(value); |
1590 | + m_manager->wifiEnabled().changed().connect([that](bool value) { |
1591 | + GMainLoopDispatch([that, value]() |
1592 | + { |
1593 | + that->m_switch->state().set(value); |
1594 | + }); |
1595 | }); |
1596 | m_switch->activated().connect([this](){ |
1597 | if (m_switch->state().get()) { |
1598 | @@ -73,8 +92,14 @@ |
1599 | }); |
1600 | |
1601 | |
1602 | - m_manager->links().changed().connect(std::bind(&Private::updateLinks, this)); |
1603 | updateLinks(); |
1604 | + m_manager->links().changed().connect([that](std::set<networking::Link::Ptr>) |
1605 | + { |
1606 | + GMainLoopDispatch([that]() |
1607 | + { |
1608 | + that->updateLinks(); |
1609 | + }); |
1610 | + }); |
1611 | |
1612 | m_openWifiSettings = std::make_shared<TextItem>(_("Wi-Fi settings…"), "wifi", "settings"); |
1613 | m_openWifiSettings->activated().connect([](){ |
1614 | @@ -115,14 +140,13 @@ |
1615 | }; |
1616 | |
1617 | WifiSection::WifiSection(std::shared_ptr<connectivity::networking::Manager> manager) |
1618 | + : d{new Private(manager)} |
1619 | { |
1620 | - d.reset(new Private(manager)); |
1621 | + d->ConstructL(); |
1622 | } |
1623 | |
1624 | WifiSection::~WifiSection() |
1625 | -{ |
1626 | - |
1627 | -} |
1628 | +{} |
1629 | |
1630 | ActionGroup::Ptr |
1631 | WifiSection::actionGroup() |
1632 | |
1633 | === modified file 'src/indicator/wifi-section.h' |
1634 | --- src/indicator/wifi-section.h 2014-08-15 11:49:44 +0000 |
1635 | +++ src/indicator/wifi-section.h 2014-10-31 14:07:40 +0000 |
1636 | @@ -27,7 +27,7 @@ |
1637 | class WifiSection : public Section |
1638 | { |
1639 | class Private; |
1640 | - std::unique_ptr<Private> d; |
1641 | + std::shared_ptr<Private> d; |
1642 | |
1643 | public: |
1644 | typedef std::shared_ptr<WifiSection> Ptr; |
1645 | |
1646 | === modified file 'src/indicator/wwan-link-item.cpp' |
1647 | --- src/indicator/wwan-link-item.cpp 2014-10-02 11:36:00 +0000 |
1648 | +++ src/indicator/wwan-link-item.cpp 2014-10-31 14:07:40 +0000 |
1649 | @@ -23,7 +23,7 @@ |
1650 | |
1651 | #include "menumodel-cpp/menu.h" |
1652 | |
1653 | -class WwanLinkItem::Private |
1654 | +class WwanLinkItem::Private : public std::enable_shared_from_this<Private> |
1655 | { |
1656 | public: |
1657 | |
1658 | @@ -39,6 +39,7 @@ |
1659 | |
1660 | Private() = delete; |
1661 | Private(Modem::Ptr modem, ModemManager::Ptr modemManager); |
1662 | + void ConstructL(); |
1663 | |
1664 | void update(); |
1665 | void unlockSim(); |
1666 | @@ -47,6 +48,10 @@ |
1667 | WwanLinkItem::Private::Private(Modem::Ptr modem, ModemManager::Ptr modemManager) |
1668 | : m_modem{modem}, |
1669 | m_modemManager{modemManager} |
1670 | +{} |
1671 | + |
1672 | +void |
1673 | +WwanLinkItem::Private::ConstructL() |
1674 | { |
1675 | m_actionGroupMerger = std::make_shared<ActionGroupMerger>(); |
1676 | m_menu = std::make_shared<Menu>(); |
1677 | @@ -60,6 +65,7 @@ |
1678 | m_showIdentifier.set(false); |
1679 | m_showIdentifier.changed().connect(std::bind(&Private::update, this)); |
1680 | |
1681 | + // already synced with GMainLoop |
1682 | m_modem->online().changed().connect(std::bind(&Private::update, this)); |
1683 | m_modem->simStatus().changed().connect(std::bind(&Private::update, this)); |
1684 | m_modem->operatorName().changed().connect(std::bind(&Private::update, this)); |
1685 | @@ -152,8 +158,10 @@ |
1686 | } |
1687 | |
1688 | WwanLinkItem::WwanLinkItem(Modem::Ptr modem, ModemManager::Ptr modemManager) |
1689 | + : d{new Private(modem, modemManager)} |
1690 | + |
1691 | { |
1692 | - d.reset(new Private(modem, modemManager)); |
1693 | + d->ConstructL(); |
1694 | } |
1695 | |
1696 | WwanLinkItem::~WwanLinkItem() |
1697 | |
1698 | === modified file 'src/indicator/wwan-section.cpp' |
1699 | --- src/indicator/wwan-section.cpp 2014-08-15 10:47:02 +0000 |
1700 | +++ src/indicator/wwan-section.cpp 2014-10-31 14:07:40 +0000 |
1701 | @@ -53,12 +53,17 @@ |
1702 | |
1703 | Private() = delete; |
1704 | Private(ModemManager::Ptr modemManager); |
1705 | + void ConstructL(); |
1706 | |
1707 | void modemsChanged(const std::set<Modem::Ptr> &modems); |
1708 | }; |
1709 | |
1710 | WwanSection::Private::Private(ModemManager::Ptr modemManager) |
1711 | : m_modemManager{modemManager} |
1712 | +{} |
1713 | + |
1714 | +void |
1715 | +WwanSection::Private::ConstructL() |
1716 | { |
1717 | m_actionGroupMerger = std::make_shared<ActionGroupMerger>(); |
1718 | m_menuMerger = std::make_shared<MenuMerger>(); |
1719 | @@ -85,6 +90,7 @@ |
1720 | }); |
1721 | m_actionGroupMerger->add(*m_openCellularSettings); |
1722 | |
1723 | + // already synced with GMainLoop |
1724 | m_modemManager->modems().changed().connect(std::bind(&Private::modemsChanged, this, std::placeholders::_1)); |
1725 | modemsChanged(m_modemManager->modems()); |
1726 | } |
1727 | @@ -149,8 +155,9 @@ |
1728 | } |
1729 | |
1730 | WwanSection::WwanSection(ModemManager::Ptr modemManager) |
1731 | + : d{new Private(modemManager)} |
1732 | { |
1733 | - d.reset(new Private(modemManager)); |
1734 | + d->ConstructL(); |
1735 | } |
1736 | |
1737 | WwanSection::~WwanSection() |
1738 | |
1739 | === modified file 'src/indicator/wwan-section.h' |
1740 | --- src/indicator/wwan-section.h 2014-08-15 11:52:50 +0000 |
1741 | +++ src/indicator/wwan-section.h 2014-10-31 14:07:40 +0000 |
1742 | @@ -26,7 +26,7 @@ |
1743 | class WwanSection : public Section |
1744 | { |
1745 | class Private; |
1746 | - std::unique_ptr<Private> d; |
1747 | + std::shared_ptr<Private> d; |
1748 | |
1749 | public: |
1750 | typedef std::shared_ptr<WwanSection> Ptr; |
1751 | |
1752 | === modified file 'src/menumodel-cpp/gio-helpers/util.cpp' |
1753 | --- src/menumodel-cpp/gio-helpers/util.cpp 2014-09-26 13:07:27 +0000 |
1754 | +++ src/menumodel-cpp/gio-helpers/util.cpp 2014-10-31 14:07:40 +0000 |
1755 | @@ -25,28 +25,28 @@ |
1756 | gboolean |
1757 | GMainLoopDispatch::dispatch_cb(gpointer) |
1758 | { |
1759 | - std::lock_guard<std::mutex> lock(_lock); |
1760 | + std::unique_lock<std::mutex> lock(_lock); |
1761 | for (auto func : _funcs) { |
1762 | + lock.unlock(); |
1763 | (*func)(); |
1764 | + lock.lock(); |
1765 | delete func; |
1766 | } |
1767 | _funcs.clear(); |
1768 | return G_SOURCE_REMOVE; |
1769 | } |
1770 | |
1771 | -GMainLoopDispatch::GMainLoopDispatch(std::function<void()> func) |
1772 | +GMainLoopDispatch::GMainLoopDispatch(Func func) |
1773 | { |
1774 | + std::unique_lock<std::mutex> lock(_lock); |
1775 | + |
1776 | if (g_main_context_acquire(g_main_context_default())) { |
1777 | - if (_funcs.empty()) |
1778 | - func(); |
1779 | - else { |
1780 | - std::function<void()> *funcPtr = new std::function<void()>(func); |
1781 | - _funcs.push_back(funcPtr); |
1782 | - } |
1783 | + // already running inside GMainLoop.. |
1784 | + // free the lock and dispatch immediately. |
1785 | + lock.unlock(); |
1786 | + func(); |
1787 | g_main_context_release(g_main_context_default()); |
1788 | } else { |
1789 | - std::lock_guard<std::mutex> lock(_lock); |
1790 | - |
1791 | std::function<void()> *funcPtr = new std::function<void()>(func); |
1792 | if (_funcs.empty()) { |
1793 | g_idle_add_full(G_PRIORITY_HIGH, |
1794 | |
1795 | === modified file 'src/menumodel-cpp/gio-helpers/util.h' |
1796 | --- src/menumodel-cpp/gio-helpers/util.h 2014-09-26 13:07:27 +0000 |
1797 | +++ src/menumodel-cpp/gio-helpers/util.h 2014-10-31 14:07:40 +0000 |
1798 | @@ -54,7 +54,7 @@ |
1799 | g_main_context_release(g_main_context_default()); |
1800 | } else { |
1801 | std::unique_lock<std::mutex> lk(m_mutex); |
1802 | - g_idle_add_full(G_PRIORITY_HIGH, |
1803 | + g_idle_add_full(G_PRIORITY_HIGH + 1, |
1804 | GSourceFunc(GMainLoopSync::dispatch_cb), |
1805 | this, |
1806 | nullptr); |
1807 | @@ -77,7 +77,7 @@ |
1808 | static std::list<Func *> _funcs; |
1809 | |
1810 | //GMainLoopDispatch() = delete; |
1811 | - GMainLoopDispatch(std::function<void()> func); |
1812 | + GMainLoopDispatch(Func func); |
1813 | }; |
1814 | |
1815 | struct GObjectDeleter { |
1816 | |
1817 | === modified file 'tests/unit/indicator/menuitems/CMakeLists.txt' |
1818 | --- tests/unit/indicator/menuitems/CMakeLists.txt 2014-08-19 21:03:04 +0000 |
1819 | +++ tests/unit/indicator/menuitems/CMakeLists.txt 2014-10-31 14:07:40 +0000 |
1820 | @@ -2,6 +2,7 @@ |
1821 | set( |
1822 | MENUITEMS_CPP_UNIT_TESTS_SRC |
1823 | test-access-point-item.cpp |
1824 | + ${CMAKE_SOURCE_DIR}/src/indicator/menuitems/access-point-item.cpp |
1825 | test-switch-item.cpp |
1826 | ) |
1827 | |
1828 | |
1829 | === modified file 'tests/unit/indicator/menuitems/test-access-point-item.cpp' |
1830 | --- tests/unit/indicator/menuitems/test-access-point-item.cpp 2014-05-12 11:48:42 +0000 |
1831 | +++ tests/unit/indicator/menuitems/test-access-point-item.cpp 2014-10-31 14:07:40 +0000 |
1832 | @@ -30,6 +30,8 @@ |
1833 | using namespace QtDBusTest; |
1834 | using namespace testutils; |
1835 | |
1836 | +using namespace connectivity; |
1837 | + |
1838 | namespace |
1839 | { |
1840 |
PASSED: Continuous integration, rev:465 jenkins. qa.ubuntu. com/job/ indicator- network- ci/205/ jenkins. qa.ubuntu. com/job/ indicator- network- utopic- amd64-ci/ 79 jenkins. qa.ubuntu. com/job/ indicator- network- utopic- armhf-ci/ 79 jenkins. qa.ubuntu. com/job/ indicator- network- utopic- armhf-ci/ 79/artifact/ work/output/ *zip*/output. zip
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/indicator- network- ci/205/ rebuild
http://