Merge lp:~unity-api-team/indicator-network/second-sim-data-14.09 into lp:indicator-network/14.09

Proposed by Pete Woods
Status: Merged
Approved by: Marcus Tomlinson
Approved revision: 473
Merged at revision: 471
Proposed branch: lp:~unity-api-team/indicator-network/second-sim-data-14.09
Merge into: lp:indicator-network/14.09
Prerequisite: lp:~unity-api-team/indicator-network/lp1411714-14.09
Diff against target: 479 lines (+297/-12)
7 files modified
CMakeLists.txt (+0/-3)
src/CMakeLists.txt (+5/-0)
src/dbus-cpp/services/ofono.h (+238/-0)
src/indicator/modem.cpp (+37/-0)
src/indicator/modem.h (+2/-0)
src/indicator/root-state.cpp (+15/-5)
tests/integration/connectivity-cpp/CMakeLists.txt (+0/-4)
To merge this branch: bzr merge lp:~unity-api-team/indicator-network/second-sim-data-14.09
Reviewer Review Type Date Requested Status
Marcus Tomlinson (community) Approve
Indicator Applet Developers Pending
Review via email: mp+249830@code.launchpad.net

Commit message

Listen to connection manager powered flag to determine the active modem

Description of the change

Listen to connection manager powered flag to determine the active modem

To post a comment you must log in.
472. By Pete Woods

Listen to connection manager powered flag to determine the active modem

473. By Pete Woods

Remove -Werror hack

Revision history for this message
Pete Woods (pete-woods) wrote :

Cherry pick!

Revision history for this message
Marcus Tomlinson (marcustomlinson) wrote :

Looks good

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'CMakeLists.txt'
2--- CMakeLists.txt 2014-10-09 10:58:30 +0000
3+++ CMakeLists.txt 2015-02-16 18:34:52 +0000
4@@ -98,9 +98,6 @@
5 include_directories(${CMAKE_BINARY_DIR})
6
7 set(COMMON_FLAGS "-Wall -Wextra -Wpedantic -fno-permissive -fPIC -fvisibility=hidden -pthread")
8-if(NOT build_type_lower MATCHES debug)
9- set(COMMON_FLAGS "${COMMON_FLAGS} -Werror")
10-endif()
11
12 # "nice bug" in cmake... http://www.cmake.org/Bug/view.php?id=15058
13 # let's not set C_FLAGS as it will break pthreads detection \o/
14
15=== modified file 'src/CMakeLists.txt'
16--- src/CMakeLists.txt 2014-08-19 19:55:15 +0000
17+++ src/CMakeLists.txt 2015-02-16 18:34:52 +0000
18@@ -1,3 +1,8 @@
19+
20+if(NOT build_type_lower MATCHES debug)
21+ set(COMMON_FLAGS "${COMMON_FLAGS} -Werror")
22+endif()
23+
24 add_subdirectory(dbus-cpp)
25 add_subdirectory(connectivity-cpp)
26 add_subdirectory(indicator)
27
28=== modified file 'src/dbus-cpp/services/ofono.h'
29--- src/dbus-cpp/services/ofono.h 2015-02-16 18:34:52 +0000
30+++ src/dbus-cpp/services/ofono.h 2015-02-16 18:34:52 +0000
31@@ -791,6 +791,226 @@
32 core::Property<std::string> subscriberIdentity;
33 }; // Interface::SimManager
34
35+ struct ConnectionManager
36+ {
37+ static const std::string& name()
38+ {
39+ static const std::string s{OFONO_CONNECTION_MANAGER_INTERFACE};
40+ return s;
41+ }
42+
43+ struct Method
44+ {
45+ struct GetProperties
46+ {
47+ static const std::string& name()
48+ {
49+ static const std::string s{"GetProperties"};
50+ return s;
51+ }
52+
53+ typedef ConnectionManager Interface;
54+ typedef std::map<std::string, core::dbus::types::Variant> ResultType;
55+
56+ static std::chrono::milliseconds default_timeout()
57+ {
58+ return std::chrono::seconds{30};
59+ }
60+ };
61+
62+ struct SetProperty
63+ {
64+ static const std::string& name()
65+ {
66+ static const std::string s{"SetProperty"};
67+ return s;
68+ }
69+
70+ typedef ConnectionManager Interface;
71+ typedef void ResultType;
72+ typedef std::tuple<std::string, core::dbus::types::Variant> ArgumentType;
73+
74+ static std::chrono::milliseconds default_timeout()
75+ {
76+ return std::chrono::seconds{30};
77+ }
78+ };
79+
80+ struct AddContext
81+ {
82+ static const std::string& name()
83+ {
84+ static const std::string s{"AddContext"};
85+ return s;
86+ }
87+
88+ typedef ConnectionManager Interface;
89+ typedef core::dbus::types::ObjectPath ResultType;
90+ typedef std::string ArgumentType;
91+
92+ static std::chrono::milliseconds default_timeout()
93+ {
94+ return std::chrono::seconds{30};
95+ }
96+ };
97+
98+ struct RemoveContext
99+ {
100+ static const std::string& name()
101+ {
102+ static const std::string s{"RemoveContext"};
103+ return s;
104+ }
105+
106+ typedef ConnectionManager Interface;
107+ typedef void ResultType;
108+ typedef core::dbus::types::ObjectPath ArgumentType;
109+
110+ static std::chrono::milliseconds default_timeout()
111+ {
112+ return std::chrono::seconds{30};
113+ }
114+ };
115+
116+ struct DeactivateAll
117+ {
118+ static const std::string& name()
119+ {
120+ static const std::string s{"DeactivateAll"};
121+ return s;
122+ }
123+
124+ typedef ConnectionManager Interface;
125+ typedef void ResultType;
126+
127+ static std::chrono::milliseconds default_timeout()
128+ {
129+ return std::chrono::seconds{30};
130+ }
131+ };
132+
133+ struct GetContexts
134+ {
135+ static const std::string& name()
136+ {
137+ static const std::string s{"GetContexts"};
138+ return s;
139+ }
140+
141+ typedef ConnectionManager Interface;
142+ typedef std::tuple<core::dbus::types::ObjectPath, std::map<std::string, core::dbus::types::Variant>> ResultType;
143+
144+ static std::chrono::milliseconds default_timeout()
145+ {
146+ return std::chrono::seconds{30};
147+ }
148+ };
149+
150+ };
151+
152+ struct Property
153+ {
154+ struct Powered
155+ {
156+ static const std::string &name()
157+ {
158+ static const std::string s{"Powered"};
159+ return s;
160+ }
161+
162+ typedef ConnectionManager Interface;
163+ typedef bool ValueType;
164+ static const bool readable = true;
165+ static const bool writable = false;
166+ };
167+ };
168+
169+ struct Signal
170+ {
171+ struct PropertyChanged
172+ {
173+ static const std::string& name()
174+ {
175+ static const std::string s{"PropertyChanged"};
176+ return s;
177+ }
178+
179+ typedef ConnectionManager Interface;
180+ typedef std::tuple<std::string, core::dbus::types::Variant> ArgumentType;
181+ };
182+
183+ struct ContextAdded
184+ {
185+ static const std::string& name()
186+ {
187+ static const std::string s{"ContextAdded"};
188+ return s;
189+ }
190+
191+ typedef ConnectionManager Interface;
192+ typedef std::tuple<core::dbus::types::ObjectPath, core::dbus::types::Variant> ArgumentType;
193+ };
194+
195+ struct ContextRemoved
196+ {
197+ static const std::string& name()
198+ {
199+ static const std::string s{"ContextRemoved"};
200+ return s;
201+ }
202+
203+ typedef ConnectionManager Interface;
204+ typedef core::dbus::types::ObjectPath ArgumentType;
205+ };
206+ };
207+
208+
209+ std::map<std::string, core::dbus::types::Variant>
210+ getProperties()
211+ {
212+ auto result =
213+ object->invoke_method_synchronously<
214+ ConnectionManager::Method::GetProperties, ConnectionManager::Method::GetProperties::ResultType>();
215+
216+ if (result.is_error()) {
217+ throw std::runtime_error(result.error().print());
218+ }
219+
220+ return result.value();
221+ }
222+
223+ void _updateProperty(std::string property, core::dbus::types::Variant value)
224+ {
225+ if (property == Property::Powered::name()) {
226+ powered.set(value.as<Property::Powered::ValueType>());
227+ }
228+ }
229+
230+ typedef std::shared_ptr<ConnectionManager> Ptr;
231+ explicit ConnectionManager(const std::shared_ptr<core::dbus::Object>& object)
232+ : object(object),
233+ propertyChanged(object->get_signal<Signal::PropertyChanged>())
234+ {
235+ propertyChanged->connect([this](Signal::PropertyChanged::ArgumentType args){
236+ _updateProperty(std::get<0>(args), std::get<1>(args));
237+ });
238+ auto result = getProperties();
239+ for (auto element : result)
240+ {
241+ _updateProperty(element.first, element.second);
242+ }
243+ }
244+
245+ ~ConnectionManager()
246+ {}
247+
248+ std::shared_ptr<core::dbus::Object> object;
249+ std::shared_ptr<core::dbus::Signal<Signal::PropertyChanged, Signal::PropertyChanged::ArgumentType>> propertyChanged;
250+
251+ core::Property<bool> powered;
252+
253+ }; // Interface::ConnectionManager
254+
255 struct Modem
256 {
257 static const std::string& name()
258@@ -1026,7 +1246,16 @@
259 case Property::Interfaces::Type::CallSettings:
260 case Property::Interfaces::Type::CallVolume:
261 case Property::Interfaces::Type::CellBroadcast:
262+ break;
263 case Property::Interfaces::Type::ConnectionManager:
264+ {
265+ std::unique_lock<std::mutex> lock(_lock);
266+ if (std::find(newInterfaces.begin(), newInterfaces.end(), known) == newInterfaces.end() &&
267+ connectionManager.get()) {
268+ connectionManager.set(std::shared_ptr<ConnectionManager>());
269+ }
270+ break;
271+ }
272 case Property::Interfaces::Type::Handsfree:
273 case Property::Interfaces::Type::LocationReporting:
274 case Property::Interfaces::Type::MessageManager:
275@@ -1074,7 +1303,15 @@
276 case Property::Interfaces::Type::CallSettings:
277 case Property::Interfaces::Type::CallVolume:
278 case Property::Interfaces::Type::CellBroadcast:
279+ break;
280 case Property::Interfaces::Type::ConnectionManager:
281+ {
282+ std::unique_lock<std::mutex> lock(_lock);
283+ if (!connectionManager.get()) {
284+ connectionManager.set(std::make_shared<ConnectionManager>(this->object));
285+ }
286+ break;
287+ }
288 case Property::Interfaces::Type::Handsfree:
289 case Property::Interfaces::Type::LocationReporting:
290 case Property::Interfaces::Type::MessageManager:
291@@ -1180,6 +1417,7 @@
292
293 // this lock must be acquired for any access to networkRegistration or simManager
294 std::mutex _lock;
295+ core::Property<ConnectionManager::Ptr> connectionManager;
296 core::Property<NetworkRegistration::Ptr> networkRegistration;
297 core::Property<SimManager::Ptr> simManager;
298
299
300=== modified file 'src/indicator/modem.cpp'
301--- src/indicator/modem.cpp 2015-02-16 18:34:52 +0000
302+++ src/indicator/modem.cpp 2015-02-16 18:34:52 +0000
303@@ -36,9 +36,12 @@
304 core::Property<std::int8_t> m_strength;
305 core::Property<org::ofono::Interface::NetworkRegistration::Technology> m_technology;
306
307+ core::Property<bool> m_dataEnabled;
308+
309 core::Property<std::string> m_simIdentifier;
310 int m_index = -1;
311
312+ void connectionManagerChanged(org::ofono::Interface::ConnectionManager::Ptr conmgr);
313 void networkRegistrationChanged(org::ofono::Interface::NetworkRegistration::Ptr netreg);
314 void simManagerChanged(org::ofono::Interface::SimManager::Ptr simmgr);
315
316@@ -68,6 +71,7 @@
317 std::unique_lock<std::mutex> lock(m_ofonoModem->_lock);
318 auto simmgr = m_ofonoModem->simManager.get();
319 auto netreg = m_ofonoModem->networkRegistration.get();
320+ auto conmgr = m_ofonoModem->connectionManager.get();
321 lock.unlock();
322
323 simManagerChanged(simmgr);
324@@ -82,6 +86,12 @@
325 that->networkRegistrationChanged(netreg);
326 });
327
328+ connectionManagerChanged(conmgr);
329+ m_ofonoModem->connectionManager.changed().connect([that](org::ofono::Interface::ConnectionManager::Ptr conmgr)
330+ {
331+ that->connectionManagerChanged(conmgr);
332+ });
333+
334 /// @todo hook up with system-settings to allow changing the identifier.
335 /// for now just provide the defaults
336 const auto path = m_ofonoModem->object->path().as_string();
337@@ -103,6 +113,7 @@
338 std::unique_lock<std::mutex> lock(m_ofonoModem->_lock);
339 auto simmgr = m_ofonoModem->simManager.get();
340 auto netreg = m_ofonoModem->networkRegistration.get();
341+ auto conmgr = m_ofonoModem->connectionManager.get();
342 lock.unlock();
343
344 if (simmgr) {
345@@ -170,6 +181,12 @@
346 m_strength.set(-1);
347 m_technology.set(org::ofono::Interface::NetworkRegistration::Technology::notAvailable);
348 }
349+
350+ if (conmgr) {
351+ m_dataEnabled.set(conmgr->powered.get());
352+ } else {
353+ m_dataEnabled.set(false);
354+ }
355 }
356
357 void
358@@ -201,6 +218,20 @@
359 GMainLoopDispatch([that]() { that->update(); });
360 }
361
362+void
363+Modem::Private::connectionManagerChanged(org::ofono::Interface::ConnectionManager::Ptr conmgr)
364+{
365+ auto that = shared_from_this();
366+ if (conmgr) {
367+ conmgr->powered.changed().connect([that](bool)
368+ {
369+ GMainLoopDispatch([that]() { that->update(); });
370+ });
371+ }
372+
373+ GMainLoopDispatch([that]() { that->update(); });
374+}
375+
376
377 void
378 Modem::Private::simManagerChanged(org::ofono::Interface::SimManager::Ptr simmgr)
379@@ -372,6 +403,12 @@
380 return d->m_simIdentifier;
381 }
382
383+const core::Property<bool> &
384+Modem::dataEnabled()
385+{
386+ return d->m_dataEnabled;
387+}
388+
389 int
390 Modem::index()
391 {
392
393=== modified file 'src/indicator/modem.h'
394--- src/indicator/modem.h 2014-12-09 10:05:45 +0000
395+++ src/indicator/modem.h 2015-02-16 18:34:52 +0000
396@@ -98,6 +98,8 @@
397 const core::Property<std::int8_t> &strength();
398 const core::Property<org::ofono::Interface::NetworkRegistration::Technology> &technology();
399
400+ const core::Property<bool> &dataEnabled();
401+
402 const core::Property<std::string> &simIdentifier();
403 int index();
404
405
406=== modified file 'src/indicator/root-state.cpp'
407--- src/indicator/root-state.cpp 2014-10-29 18:12:05 +0000
408+++ src/indicator/root-state.cpp 2015-02-16 18:34:52 +0000
409@@ -43,6 +43,8 @@
410 std::map<Modem::Ptr, std::string> m_cellularIcons;
411 std::map<int, std::string> m_modemTechIcons;
412
413+ int m_activeModem = -1;
414+
415 Private() = delete;
416 Private(std::shared_ptr<networking::Manager> manager, ModemManager::Ptr modemManager);
417 void ConstructL();
418@@ -116,6 +118,7 @@
419 for (auto modem : removed)
420 m_cellularIcons.erase(modem);
421
422+ m_activeModem = -1;
423 for (auto modem : added) {
424 // modem properties and signals already synced with GMainLoop
425 modem->online().changed().connect(std::bind(&Private::updateModem, this, Modem::WeakPtr(modem)));
426@@ -123,6 +126,7 @@
427 modem->status().changed().connect(std::bind(&Private::updateModem, this, Modem::WeakPtr(modem)));
428 modem->technology().changed().connect(std::bind(&Private::updateModem, this, Modem::WeakPtr(modem)));
429 modem->strength().changed().connect(std::bind(&Private::updateModem, this, Modem::WeakPtr(modem)));
430+ modem->dataEnabled().changed().connect(std::bind(&Private::updateModem, this, Modem::WeakPtr(modem)));
431 updateModem(modem);
432 }
433 }
434@@ -136,6 +140,10 @@
435 return;
436 }
437
438+ if (modem->dataEnabled().get())
439+ {
440+ m_activeModem = modem->index();
441+ }
442 m_modemTechIcons.erase(modem->index());
443 m_cellularIcons[modem] = "";
444
445@@ -249,11 +257,13 @@
446 }
447
448 if (m_networkingIcon.empty()) {
449- // seems we don't have an active wifi connection..
450- // it must be a cellular one then.
451- /// @todo need to revise this once the modems are part of the connectivity-api
452- /// this might get us wrong results on dual-sim
453- m_networkingIcon = m_modemTechIcons[1];
454+ if (m_activeModem != -1) {
455+ auto it = m_modemTechIcons.find(m_activeModem);
456+ if (it != m_modemTechIcons.end())
457+ {
458+ m_networkingIcon = it->second;
459+ }
460+ }
461 }
462 break;
463 }
464
465=== modified file 'tests/integration/connectivity-cpp/CMakeLists.txt'
466--- tests/integration/connectivity-cpp/CMakeLists.txt 2014-08-22 14:56:59 +0000
467+++ tests/integration/connectivity-cpp/CMakeLists.txt 2015-02-16 18:34:52 +0000
468@@ -16,11 +16,7 @@
469 # Antti Kaijanmäki <antti.kaijanmaki@canonical.com>
470
471
472-set (OLD_CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
473-# Don't treat warnings as errors in 3rd_party/{gmock,cucumber-cpp}
474-string (REPLACE " -Werror " " " CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
475 include_directories(${GMOCK_INCLUDE_DIR} ${GTEST_INCLUDE_DIR})
476-set (CMAKE_CXX_FLAGS ${OLD_CMAKE_CXX_FLAGS})
477
478 if (NOT DEFINED GTEST_ROOT)
479 set(GTEST_ROOT /usr/src/gtest)

Subscribers

People subscribed via source and target branches