Merge lp:~pete-woods/libusermetrics/max-min into lp:libusermetrics

Proposed by Pete Woods
Status: Merged
Approved by: Pete Woods
Approved revision: 132
Merged at revision: 129
Proposed branch: lp:~pete-woods/libusermetrics/max-min
Merge into: lp:libusermetrics
Diff against target: 2910 lines (+1366/-190)
49 files modified
data/com.canonical.UserMetrics.xml (+3/-0)
data/com.canonical.usermetrics.DataSource.xml (+17/-1)
debian/libusermetricsinput1.symbols (+22/-0)
examples/MetricManagerAdvanced.cpp (+4/-2)
examples/MetricManagerAdvancedCAPI.c (+16/-2)
examples/MetricManagerIncrementToday.cpp (+4/-2)
examples/MetricManagerIncrementTodayCAPI.c (+15/-2)
examples/MetricManagerUpdateToday.cpp (+4/-2)
examples/MetricManagerUpdateTodayCAPI.c (+15/-2)
po/en_GB.po (+5/-5)
po/libusermetrics.pot (+5/-5)
src/libusermetricsinput/CMakeLists.txt (+1/-0)
src/libusermetricsinput/Metric.h (+4/-0)
src/libusermetricsinput/MetricImpl.cpp (+9/-5)
src/libusermetricsinput/MetricImpl.h (+6/-3)
src/libusermetricsinput/MetricManager.h (+35/-1)
src/libusermetricsinput/MetricManagerImpl.cpp (+79/-5)
src/libusermetricsinput/MetricManagerImpl.h (+2/-0)
src/libusermetricsinput/main-increment.cpp (+5/-1)
src/libusermetricsinput/main.cpp (+5/-1)
src/libusermetricsinput/usermetricsinput.cpp (+94/-6)
src/libusermetricsinput/usermetricsinput.h (+96/-11)
src/libusermetricsoutput/DataSet.cpp (+47/-13)
src/libusermetricsoutput/DataSet.h (+11/-1)
src/libusermetricsoutput/DataSource.cpp (+23/-1)
src/libusermetricsoutput/DataSource.h (+25/-0)
src/libusermetricsoutput/SyncedDataSet.cpp (+2/-2)
src/libusermetricsoutput/SyncedDataSet.h (+1/-1)
src/libusermetricsoutput/SyncedDataSource.cpp (+14/-0)
src/libusermetricsoutput/SyncedDataSource.h (+3/-0)
src/libusermetricsoutput/SyncedUserData.cpp (+32/-15)
src/libusermetricsoutput/SyncedUserData.h (+8/-2)
src/libusermetricsoutput/SyncedUserMetricsStore.cpp (+35/-3)
src/libusermetricsoutput/SyncedUserMetricsStore.h (+6/-1)
src/libusermetricsoutput/UserData.cpp (+3/-2)
src/libusermetricsoutput/UserData.h (+4/-1)
src/usermetricsservice/DBusDataSource.cpp (+124/-0)
src/usermetricsservice/DBusDataSource.h (+28/-0)
src/usermetricsservice/DBusUserMetrics.cpp (+41/-2)
src/usermetricsservice/DBusUserMetrics.h (+5/-8)
src/usermetricsservice/database/DataSource.cpp (+42/-1)
src/usermetricsservice/database/DataSource.h (+40/-0)
src/usermetricsservice/main.cpp (+1/-1)
tests/unit/libusermetricsinput/TestMetricManagerImpl.cpp (+97/-0)
tests/unit/libusermetricsinput/TestUserMetricInputCAPI.cpp (+56/-15)
tests/unit/libusermetricsoutput/TestDataSet.cpp (+15/-13)
tests/unit/libusermetricsoutput/TestSyncedUserMetricsStore.cpp (+98/-11)
tests/unit/libusermetricsoutput/TestUserMetricsImpl.cpp (+141/-28)
tests/unit/usermetricsservice/TestUserMetricsService.cpp (+18/-13)
To merge this branch: bzr merge lp:~pete-woods/libusermetrics/max-min
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Approve
Unity Team Pending
Review via email: mp+183928@code.launchpad.net

Commit message

Add support for max and min

Description of the change

Add support for max and min

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
132. By Pete Woods

Update examples

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'data/com.canonical.UserMetrics.xml'
2--- data/com.canonical.UserMetrics.xml 2013-07-03 12:29:56 +0000
3+++ data/com.canonical.UserMetrics.xml 2013-09-04 17:46:16 +0000
4@@ -15,11 +15,14 @@
5 </signal>
6
7 <method name="createDataSource">
8+ <annotation name="org.qtproject.QtDBus.QtTypeName.In5" value="QVariantMap"/>
9 <arg type="o" direction="out"/>
10 <arg name="name" type="s" direction="in"/>
11 <arg name="formatString" type="s" direction="in"/>
12 <arg name="emptyDataString" type="s" direction="in"/>
13 <arg name="textDomain" type="s" direction="in"/>
14+ <arg name="metricType" type="u" direction="in"/>
15+ <arg name="options" type="a{sv}" direction="in"/>
16 </method>
17
18 <property name="userDatas" type="ao" access="read"/>
19
20=== modified file 'data/com.canonical.usermetrics.DataSource.xml'
21--- data/com.canonical.usermetrics.DataSource.xml 2013-07-03 12:29:56 +0000
22+++ data/com.canonical.usermetrics.DataSource.xml 2013-09-04 17:46:16 +0000
23@@ -6,6 +6,7 @@
24
25 <property name="formatString" type="s" access="readwrite"/>
26
27+
28 <signal name="formatStringChanged">
29 <arg name="formatString" type="s" direction="out"/>
30 </signal>
31@@ -20,7 +21,22 @@
32
33 <signal name="textDomainChanged">
34 <arg name="textDomain" type="s" direction="out"/>
35- </signal>
36+ </signal>
37+
38+ <property name="metricType" type="u" access="readwrite"/>
39+
40+ <signal name="metricTypeChanged">
41+ <arg name="metricType" type="u" direction="out"/>
42+ </signal>
43+
44+ <property name="options" type="a{sv}" access="readwrite">
45+ <annotation name="org.qtproject.QtDBus.QtTypeName" value="QVariantMap"/>
46+ </property>
47+
48+ <signal name="optionsChanged">
49+ <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QVariantMap"/>
50+ <arg name="options" type="a{sv}" direction="out"/>
51+ </signal>
52
53 </interface>
54 </node>
55\ No newline at end of file
56
57=== modified file 'debian/libusermetricsinput1.symbols'
58--- debian/libusermetricsinput1.symbols 2013-07-10 15:23:18 +0000
59+++ debian/libusermetricsinput1.symbols 2013-09-04 17:46:16 +0000
60@@ -10,6 +10,17 @@
61 (c++)"UserMetricsInput::MetricManager::~MetricManager()@Base" 1.0.1
62 (c++)"UserMetricsInput::MetricManager::~MetricManager()@Base" 1.0.1
63 (c++)"UserMetricsInput::MetricManager::~MetricManager()@Base" 1.0.1
64+ (c++)"UserMetricsInput::MetricParameters::textDomain(QString const&)@Base" 1.1.1
65+ (c++)"UserMetricsInput::MetricParameters::formatString(QString const&)@Base" 1.1.1
66+ (c++)"UserMetricsInput::MetricParameters::emptyDataString(QString const&)@Base" 1.1.1
67+ (c++)"UserMetricsInput::MetricParameters::type(UserMetricsInput::MetricType)@Base" 1.1.1
68+ (c++)"UserMetricsInput::MetricParameters::maximum(double)@Base" 1.1.1
69+ (c++)"UserMetricsInput::MetricParameters::minimum(double)@Base" 1.1.1
70+ (c++)"UserMetricsInput::MetricParameters::MetricParameters(QString const&)@Base" 1.1.1
71+ (c++)"UserMetricsInput::MetricParameters::MetricParameters(QString const&)@Base" 1.1.1
72+ (c++)"UserMetricsInput::MetricParameters::~MetricParameters()@Base" 1.1.1
73+ (c++)"UserMetricsInput::MetricParameters::~MetricParameters()@Base" 1.1.1
74+ (c++)"UserMetricsInput::MetricParameters::~MetricParameters()@Base" 1.1.1
75 (c++)"UserMetricsInput::Metric::Metric(QObject*)@Base" 1.0.1
76 (c++)"UserMetricsInput::Metric::Metric(QObject*)@Base" 1.0.1
77 (c++)"UserMetricsInput::Metric::~Metric()@Base" 1.0.1
78@@ -17,12 +28,15 @@
79 (c++)"UserMetricsInput::Metric::~Metric()@Base" 1.0.1
80 (c++)"typeinfo for UserMetricsInput::MetricUpdate@Base" 1.0.1
81 (c++)"typeinfo for UserMetricsInput::MetricManager@Base" 1.0.1
82+ (c++)"typeinfo for UserMetricsInput::MetricParameters@Base" 1.1.1
83 (c++)"typeinfo for UserMetricsInput::Metric@Base" 1.0.1
84 (c++)"typeinfo name for UserMetricsInput::MetricUpdate@Base" 1.0.1
85 (c++)"typeinfo name for UserMetricsInput::MetricManager@Base" 1.0.1
86+ (c++)"typeinfo name for UserMetricsInput::MetricParameters@Base" 1.1.1
87 (c++)"typeinfo name for UserMetricsInput::Metric@Base" 1.0.1
88 (c++)"vtable for UserMetricsInput::MetricUpdate@Base" 1.0.1
89 (c++)"vtable for UserMetricsInput::MetricManager@Base" 1.0.1
90+ (c++)"vtable for UserMetricsInput::MetricParameters@Base" 1.1.1
91 (c++)"vtable for UserMetricsInput::Metric@Base" 1.0.1
92 usermetricsinput_metric_increment@Base 1.0.5
93 usermetricsinput_metric_update@Base 1.0.1
94@@ -30,6 +44,14 @@
95 usermetricsinput_metricmanager_add@Base 1.0.1
96 usermetricsinput_metricmanager_delete@Base 1.0.1
97 usermetricsinput_metricmanager_new@Base 1.0.1
98+ usermetricsinput_metricparameters_delete@Base 1.1.1
99+ usermetricsinput_metricparameters_new@Base 1.1.1
100+ usermetricsinput_metricparameters_set_empty_data_string@Base 1.1.1
101+ usermetricsinput_metricparameters_set_format_string@Base 1.1.1
102+ usermetricsinput_metricparameters_set_maximum@Base 1.1.1
103+ usermetricsinput_metricparameters_set_minimum@Base 1.1.1
104+ usermetricsinput_metricparameters_set_text_domain@Base 1.1.1
105+ usermetricsinput_metricparameters_set_type@Base 1.1.1
106 usermetricsinput_metricupdate_add_data@Base 1.0.1
107 usermetricsinput_metricupdate_add_null@Base 1.0.1
108 usermetricsinput_metricupdate_delete@Base 1.0.1
109
110=== modified file 'examples/MetricManagerAdvanced.cpp'
111--- examples/MetricManagerAdvanced.cpp 2013-07-09 16:51:58 +0000
112+++ examples/MetricManagerAdvanced.cpp 2013-09-04 17:46:16 +0000
113@@ -11,8 +11,10 @@
114
115 // You can hold onto this shared pointer for as long as you want
116 MetricPtr metric(
117- manager->add("twitter", "<b>%1</b> tweets received today",
118- "No tweets today", APP_ID));
119+ manager->add(
120+ MetricParameters("twitter").formatString(
121+ "<b>%1</b> tweets received today").emptyDataString(
122+ "No tweets today").textDomain(APP_ID)));
123
124 // The update is sent when the update object is destroyed
125 MetricUpdatePtr update(metric->update());
126
127=== modified file 'examples/MetricManagerAdvancedCAPI.c'
128--- examples/MetricManagerAdvancedCAPI.c 2013-07-09 16:51:58 +0000
129+++ examples/MetricManagerAdvancedCAPI.c 2013-09-04 17:46:16 +0000
130@@ -6,11 +6,25 @@
131 UserMetricsInputMetricManager metricManager =
132 usermetricsinput_metricmanager_new();
133
134+ // Create a parameters object
135+ UserMetricsInputMetricParameters parameters =
136+ usermetricsinput_metricparameters_new("twitter");
137+
138+ // Set its attributes
139+ usermetricsinput_metricparameters_set_format_string(parameters,
140+ "<b>%1</b> tweets received today");
141+ usermetricsinput_metricparameters_set_empty_data_string(parameters,
142+ "No tweets today");
143+ usermetricsinput_metricparameters_set_text_domain(parameters,
144+ "myapptextdomain");
145+
146 // You can hold onto this shared object for as long as you want.
147 // It will be destroyed when the manager is destroyed.
148 UserMetricsInputMetric metric = usermetricsinput_metricmanager_add(
149- metricManager, "twitter", "<b>%1</b> tweets received today",
150- "No tweets today", "myapptextdomain");
151+ metricManager, parameters);
152+
153+ // Remember to free the parameters object after use
154+ usermetricsinput_metricparameters_delete(parameters);
155
156 // The update is sent when the update object is destroyed.
157 // Providing a blank username string will use the current
158
159=== modified file 'examples/MetricManagerIncrementToday.cpp'
160--- examples/MetricManagerIncrementToday.cpp 2013-07-10 15:37:18 +0000
161+++ examples/MetricManagerIncrementToday.cpp 2013-09-04 17:46:16 +0000
162@@ -11,8 +11,10 @@
163
164 // You can hold onto this shared pointer for as long as you want
165 MetricPtr metric(
166- manager->add("photo-app-photos", "<b>%1</b> photos taken today",
167- "No photos taken today", APP_ID));
168+ manager->add(
169+ MetricParameters("photo-app-photos").formatString(
170+ "<b>%1</b> photos taken today").emptyDataString(
171+ "No photos taken today").textDomain(APP_ID)));
172
173 // The default parameters for increment cause it to be incremented by 1.0,
174 // for the current user.
175
176=== modified file 'examples/MetricManagerIncrementTodayCAPI.c'
177--- examples/MetricManagerIncrementTodayCAPI.c 2013-07-10 15:37:18 +0000
178+++ examples/MetricManagerIncrementTodayCAPI.c 2013-09-04 17:46:16 +0000
179@@ -5,10 +5,23 @@
180 UserMetricsInputMetricManager metricManager =
181 usermetricsinput_metricmanager_new();
182
183+ // Create a parameters object
184+ UserMetricsInputMetricParameters parameters =
185+ usermetricsinput_metricparameters_new("photo-app-photos");
186+
187+ // Set its attributes
188+ usermetricsinput_metricparameters_set_format_string(parameters,
189+ "<b>%1</b> photos taken today");
190+ usermetricsinput_metricparameters_set_empty_data_string(parameters,
191+ "No photos today");
192+ usermetricsinput_metricparameters_set_text_domain(parameters, APP_ID);
193+
194 // You can hold onto this shared object for as long as you want
195 UserMetricsInputMetric metric = usermetricsinput_metricmanager_add(
196- metricManager, "photo-app-photos", "<b>%1</b> photos taken today",
197- "No photos today", APP_ID);
198+ metricManager, parameters);
199+
200+ // Remember to free the parameters object after use
201+ usermetricsinput_metricparameters_delete(parameters);
202
203 // Providing a blank username string will use the current
204 // user according to the USER environment variable.
205
206=== modified file 'examples/MetricManagerUpdateToday.cpp'
207--- examples/MetricManagerUpdateToday.cpp 2013-07-11 17:13:36 +0000
208+++ examples/MetricManagerUpdateToday.cpp 2013-09-04 17:46:16 +0000
209@@ -11,8 +11,10 @@
210
211 // You can hold onto this shared pointer for as long as you want
212 MetricPtr metric(
213- manager->add("photo-app-photos", "<b>%1</b> photos taken today",
214- "No photos taken today", APP_ID));
215+ manager->add(
216+ MetricParameters("photo-app-photos").formatString(
217+ "<b>%1</b> photos taken today").emptyDataString(
218+ "No photos taken today").textDomain(APP_ID)));
219
220 // Get the data from somewhere
221 PhotoLibrary photoLibrary;
222
223=== modified file 'examples/MetricManagerUpdateTodayCAPI.c'
224--- examples/MetricManagerUpdateTodayCAPI.c 2013-07-11 17:13:36 +0000
225+++ examples/MetricManagerUpdateTodayCAPI.c 2013-09-04 17:46:16 +0000
226@@ -5,10 +5,23 @@
227 UserMetricsInputMetricManager metricManager =
228 usermetricsinput_metricmanager_new();
229
230+ // Create a parameters object
231+ UserMetricsInputMetricParameters parameters =
232+ usermetricsinput_metricparameters_new("photo-app-photos");
233+
234+ // Set its attributes
235+ usermetricsinput_metricparameters_set_format_string(parameters,
236+ "<b>%1</b> photos taken today");
237+ usermetricsinput_metricparameters_set_empty_data_string(parameters,
238+ "No photos today");
239+ usermetricsinput_metricparameters_set_text_domain(parameters, APP_ID);
240+
241 // You can hold onto this shared object for as long as you want
242 UserMetricsInputMetric metric = usermetricsinput_metricmanager_add(
243- metricManager, "photo-app-photos", "<b>%1</b> photos taken today",
244- "No photos today", APP_ID);
245+ metricManager, parameters);
246+
247+ // Remember to free the parameters object after use
248+ usermetricsinput_metricparameters_delete(parameters);
249
250 // Providing a blank username string will use the current
251 // user according to the USER environment variable.
252
253=== modified file 'po/en_GB.po'
254--- po/en_GB.po 2013-08-08 14:45:45 +0000
255+++ po/en_GB.po 2013-09-04 17:46:16 +0000
256@@ -7,7 +7,7 @@
257 msgstr ""
258 "Project-Id-Version: libusermetrics\n"
259 "Report-Msgid-Bugs-To: \n"
260-"POT-Creation-Date: 2013-07-24 10:08+0100\n"
261+"POT-Creation-Date: 2013-08-20 23:37+0100\n"
262 "PO-Revision-Date: 2013-07-05 15:09+0100\n"
263 "Last-Translator: Pete Woods <pete.woods@canonical.com>\n"
264 "Language-Team: British English <en@li.org>\n"
265@@ -25,7 +25,7 @@
266 msgid "Could not register user data object with DBus"
267 msgstr ""
268
269-#: src/usermetricsservice/DBusDataSet.cpp:120
270+#: src/usermetricsservice/DBusDataSet.cpp:124
271 #: src/usermetricsservice/DBusUserData.cpp:104
272 msgid "Could not save data set"
273 msgstr ""
274@@ -54,7 +54,7 @@
275 msgid "Data set query failed"
276 msgstr "Data set query failed"
277
278-#: src/libusermetricsoutput/UserMetricsImpl.cpp:259
279+#: src/libusermetricsoutput/UserMetricsImpl.cpp:260
280 msgid "Data source not found"
281 msgstr "Data source not found"
282
283@@ -66,11 +66,11 @@
284 msgid "New data set could not be found"
285 msgstr "New data set couldn't be found"
286
287-#: src/libusermetricsoutput/UserMetricsImpl.cpp:265
288+#: src/libusermetricsoutput/UserMetricsImpl.cpp:266
289 msgid "No data for today"
290 msgstr "No data for today"
291
292-#: src/libusermetricsoutput/UserMetricsImpl.cpp:197
293+#: src/libusermetricsoutput/UserMetricsImpl.cpp:198
294 msgid "No data sources available"
295 msgstr "No data sources available"
296
297
298=== modified file 'po/libusermetrics.pot'
299--- po/libusermetrics.pot 2013-08-08 14:45:45 +0000
300+++ po/libusermetrics.pot 2013-09-04 17:46:16 +0000
301@@ -8,7 +8,7 @@
302 msgstr ""
303 "Project-Id-Version: libusermetrics\n"
304 "Report-Msgid-Bugs-To: \n"
305-"POT-Creation-Date: 2013-07-24 10:08+0100\n"
306+"POT-Creation-Date: 2013-09-02 13:01+0100\n"
307 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
308 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
309 "Language-Team: LANGUAGE <LL@li.org>\n"
310@@ -52,7 +52,7 @@
311 msgid "Could not save user data"
312 msgstr ""
313
314-#: src/usermetricsservice/DBusDataSet.cpp:120
315+#: src/usermetricsservice/DBusDataSet.cpp:124
316 #: src/usermetricsservice/DBusUserData.cpp:104
317 msgid "Could not save data set"
318 msgstr ""
319@@ -86,14 +86,14 @@
320 msgid "DATA_SOURCE_ID FORMAT_STRING EMPTY_DATA_STRING USERNAME <DATA>"
321 msgstr ""
322
323-#: src/libusermetricsoutput/UserMetricsImpl.cpp:197
324+#: src/libusermetricsoutput/UserMetricsImpl.cpp:198
325 msgid "No data sources available"
326 msgstr ""
327
328-#: src/libusermetricsoutput/UserMetricsImpl.cpp:259
329+#: src/libusermetricsoutput/UserMetricsImpl.cpp:260
330 msgid "Data source not found"
331 msgstr ""
332
333-#: src/libusermetricsoutput/UserMetricsImpl.cpp:265
334+#: src/libusermetricsoutput/UserMetricsImpl.cpp:266
335 msgid "No data for today"
336 msgstr ""
337
338=== modified file 'src/libusermetricsinput/CMakeLists.txt'
339--- src/libusermetricsinput/CMakeLists.txt 2013-07-22 10:43:24 +0000
340+++ src/libusermetricsinput/CMakeLists.txt 2013-09-04 17:46:16 +0000
341@@ -17,6 +17,7 @@
342 MetricImpl.cpp
343 MetricManager.cpp
344 MetricManagerImpl.cpp
345+ MetricManagerImpl.cpp
346 MetricUpdate.cpp
347 MetricUpdateImpl.cpp
348 usermetricsinput.cpp
349
350=== modified file 'src/libusermetricsinput/Metric.h'
351--- src/libusermetricsinput/Metric.h 2013-07-10 15:23:18 +0000
352+++ src/libusermetricsinput/Metric.h 2013-09-04 17:46:16 +0000
353@@ -35,6 +35,10 @@
354 */
355 typedef QSharedPointer<Metric> MetricPtr;
356
357+enum MetricType {
358+ USER, SYSTEM,
359+};
360+
361 /**
362 * @brief This class represents a single user metric
363 *
364
365=== modified file 'src/libusermetricsinput/MetricImpl.cpp'
366--- src/libusermetricsinput/MetricImpl.cpp 2013-07-17 10:22:05 +0000
367+++ src/libusermetricsinput/MetricImpl.cpp 2013-09-04 17:46:16 +0000
368@@ -31,10 +31,12 @@
369 using namespace UserMetricsInput;
370
371 MetricImpl::MetricImpl(const QString &dataSourceId, const QString &formatString,
372- const QDBusConnection &dbusConnection, QObject *parent) :
373- Metric(parent), m_dbusConnection(dbusConnection), m_interface(
374+ const QString &dataSourcePath, const QDBusConnection &dbusConnection,
375+ QObject *parent) :
376+ Metric(parent), m_dbusConnection(dbusConnection), m_userMetrics(
377 DBusPaths::serviceName(), DBusPaths::userMetrics(),
378- dbusConnection), m_dataSourceId(dataSourceId), m_formatString(
379+ dbusConnection), m_dataSource(DBusPaths::serviceName(),
380+ dataSourcePath, dbusConnection), m_dataSourceId(dataSourceId), m_formatString(
381 formatString) {
382 }
383
384@@ -43,13 +45,15 @@
385
386 QDBusObjectPath MetricImpl::createDataSet(const QString &usernameIn) {
387 QString username;
388- if (usernameIn.isEmpty()) {
389+ if (m_dataSource.metricType() == MetricType::SYSTEM) {
390+ username = "";
391+ } else if (usernameIn.isEmpty()) {
392 username = QString::fromUtf8(qgetenv("USER"));
393 } else {
394 username = usernameIn;
395 }
396
397- QDBusObjectPath userDataPath(m_interface.createUserData(username));
398+ QDBusObjectPath userDataPath(m_userMetrics.createUserData(username));
399
400 com::canonical::usermetrics::UserData userDataInterface(
401 DBusPaths::serviceName(), userDataPath.path(), m_dbusConnection);
402
403=== modified file 'src/libusermetricsinput/MetricImpl.h'
404--- src/libusermetricsinput/MetricImpl.h 2013-07-10 15:23:18 +0000
405+++ src/libusermetricsinput/MetricImpl.h 2013-09-04 17:46:16 +0000
406@@ -21,6 +21,7 @@
407
408 #include <libusermetricsinput/Metric.h>
409 #include <libusermetricscommon/UserMetricsInterface.h>
410+#include <libusermetricscommon/DataSourceInterface.h>
411
412 #include <QtCore/QObject>
413 #include <QtCore/QString>
414@@ -31,8 +32,8 @@
415 class MetricImpl: public Metric {
416 public:
417 explicit MetricImpl(const QString &dataSourceId,
418- const QString &formatString, const QDBusConnection &dbusConnection,
419- QObject *parent = 0);
420+ const QString &formatString, const QString &dataSourcePath,
421+ const QDBusConnection &dbusConnection, QObject *parent = 0);
422
423 virtual ~MetricImpl();
424
425@@ -47,7 +48,9 @@
426
427 QDBusConnection m_dbusConnection;
428
429- com::canonical::UserMetrics m_interface;
430+ com::canonical::UserMetrics m_userMetrics;
431+
432+ com::canonical::usermetrics::DataSource m_dataSource;
433
434 QString m_dataSourceId;
435
436
437=== modified file 'src/libusermetricsinput/MetricManager.h'
438--- src/libusermetricsinput/MetricManager.h 2013-07-10 15:37:18 +0000
439+++ src/libusermetricsinput/MetricManager.h 2013-09-04 17:46:16 +0000
440@@ -31,12 +31,35 @@
441 namespace UserMetricsInput {
442
443 class MetricManager;
444+class MetricParametersPrivate;
445
446 /**
447 * @brief Shared pointer for the MetricManager
448 **/
449 typedef QScopedPointer<MetricManager> MetricManagerPtr;
450
451+class Q_DECL_EXPORT MetricParameters {
452+public:
453+
454+ explicit MetricParameters(const QString &dataSourceId);
455+
456+ MetricParameters & formatString(const QString &formatString);
457+
458+ MetricParameters & emptyDataString(const QString &emptyDataString);
459+
460+ MetricParameters & textDomain(const QString &textDomain);
461+
462+ MetricParameters & minimum(double minimum);
463+
464+ MetricParameters & maximum(double maximum);
465+
466+ MetricParameters & type(MetricType type);
467+
468+ virtual ~MetricParameters();
469+
470+ QScopedPointer<MetricParametersPrivate> p;
471+};
472+
473 /**
474 * @brief Central place for registering and updating user metrics.
475 *
476@@ -70,13 +93,24 @@
477 * @param emptyDataString The string to print in the case of no data, e.g. "No messages received today"
478 * @param textDomain The translation domain
479 *
480- * This will register a new user Metric with the above paramters. It is
481+ * This will register a new user Metric with the above parameters. It is
482 * acceptable to call this method more than once. The same Metric instance
483 * will be returned.
484 */
485 virtual MetricPtr add(const QString &dataSourceId,
486 const QString &formatString, const QString &emptyDataString = "",
487 const QString &textDomain = "") = 0;
488+
489+ /**
490+ * @brief Register a new Metric.
491+ *
492+ * @param parameters The parameters of the Metric to register
493+ *
494+ * This will register a new user Metric with the above parameters. It is
495+ * acceptable to call this method more than once. The same Metric instance
496+ * will be returned.
497+ */
498+ virtual MetricPtr add(const MetricParameters &parameters) = 0;
499 };
500
501 /**
502
503=== modified file 'src/libusermetricsinput/MetricManagerImpl.cpp'
504--- src/libusermetricsinput/MetricManagerImpl.cpp 2013-07-09 16:51:58 +0000
505+++ src/libusermetricsinput/MetricManagerImpl.cpp 2013-09-04 17:46:16 +0000
506@@ -29,6 +29,70 @@
507 using namespace UserMetricsCommon;
508 using namespace UserMetricsInput;
509
510+class UserMetricsInput::MetricParametersPrivate {
511+ friend class MetricManagerImpl;
512+ friend class MetricParameters;
513+
514+public:
515+ explicit MetricParametersPrivate(const QString &dataSourceId) :
516+ m_dataSourceId(dataSourceId), m_type(MetricType::USER) {
517+ }
518+
519+ ~MetricParametersPrivate() {
520+ }
521+
522+protected:
523+ QString m_dataSourceId;
524+
525+ QString m_formatString;
526+
527+ QString m_emptyDataString;
528+
529+ QString m_textDomain;
530+
531+ MetricType m_type;
532+
533+ QVariantMap m_options;
534+};
535+
536+MetricParameters::MetricParameters(const QString &dataSourceId) :
537+ p(new MetricParametersPrivate(dataSourceId)) {
538+}
539+
540+MetricParameters::~MetricParameters() {
541+}
542+
543+MetricParameters & MetricParameters::formatString(const QString &formatString) {
544+ p->m_formatString = formatString;
545+ return *this;
546+}
547+
548+MetricParameters & MetricParameters::emptyDataString(
549+ const QString &emptyDataString) {
550+ p->m_emptyDataString = emptyDataString;
551+ return *this;
552+}
553+
554+MetricParameters & MetricParameters::textDomain(const QString &textDomain) {
555+ p->m_textDomain = textDomain;
556+ return *this;
557+}
558+
559+MetricParameters & MetricParameters::minimum(double minimum) {
560+ p->m_options["minimum"] = minimum;
561+ return *this;
562+}
563+
564+MetricParameters & MetricParameters::maximum(double maximum) {
565+ p->m_options["maximum"] = maximum;
566+ return *this;
567+}
568+
569+MetricParameters & MetricParameters::type(MetricType type) {
570+ p->m_type = type;
571+ return *this;
572+}
573+
574 MetricManagerImpl::MetricManagerImpl(const QDBusConnection &dbusConnection,
575 QObject *parent) :
576 MetricManager(parent), m_dbusConnection(dbusConnection), m_interface(
577@@ -42,9 +106,17 @@
578 MetricPtr MetricManagerImpl::add(const QString &dataSourceId,
579 const QString &formatString, const QString &emptyDataString,
580 const QString &textDomain) {
581+ return add(
582+ MetricParameters(dataSourceId).formatString(formatString).emptyDataString(
583+ emptyDataString).textDomain(textDomain));
584+}
585+
586+MetricPtr MetricManagerImpl::add(const MetricParameters &parameters) {
587 QDBusPendingReply<QDBusObjectPath> reply(
588- m_interface.createDataSource(dataSourceId, formatString,
589- emptyDataString, textDomain));
590+ m_interface.createDataSource(parameters.p->m_dataSourceId,
591+ parameters.p->m_formatString,
592+ parameters.p->m_emptyDataString, parameters.p->m_textDomain,
593+ parameters.p->m_type, parameters.p->m_options));
594
595 reply.waitForFinished();
596
597@@ -54,11 +126,13 @@
598
599 QDBusObjectPath path(reply.value());
600
601- auto metric(m_metrics.find(dataSourceId));
602+ auto metric(m_metrics.find(parameters.p->m_dataSourceId));
603 if (metric == m_metrics.end()) {
604 MetricPtr newMetric(
605- new MetricImpl(dataSourceId, formatString, m_dbusConnection));
606- metric = m_metrics.insert(dataSourceId, newMetric);
607+ new MetricImpl(parameters.p->m_dataSourceId,
608+ parameters.p->m_formatString, path.path(),
609+ m_dbusConnection));
610+ metric = m_metrics.insert(parameters.p->m_dataSourceId, newMetric);
611 }
612 return *metric;
613 }
614
615=== modified file 'src/libusermetricsinput/MetricManagerImpl.h'
616--- src/libusermetricsinput/MetricManagerImpl.h 2013-07-03 12:29:56 +0000
617+++ src/libusermetricsinput/MetricManagerImpl.h 2013-09-04 17:46:16 +0000
618@@ -37,6 +37,8 @@
619 const QString &formatString, const QString &emptyDataString = "",
620 const QString &textDomain = "");
621
622+ virtual MetricPtr add(const MetricParameters &parameters);
623+
624 protected:
625 QDBusConnection m_dbusConnection;
626
627
628=== modified file 'src/libusermetricsinput/main-increment.cpp'
629--- src/libusermetricsinput/main-increment.cpp 2013-07-22 10:43:24 +0000
630+++ src/libusermetricsinput/main-increment.cpp 2013-09-04 17:46:16 +0000
631@@ -44,7 +44,11 @@
632 QString username(QString::fromUtf8(argv[4]));
633
634 MetricManagerPtr manager(MetricManager::getInstance());
635- MetricPtr metric(manager->add(dataSourceId, formatString, emptyDataString));
636+ MetricPtr metric(
637+ manager->add(
638+ MetricParameters(dataSourceId).formatString(formatString).emptyDataString(
639+ emptyDataString).type(
640+ username.isEmpty() ? SYSTEM : USER)));
641
642 if (argc == 6) {
643 metric->increment(stod(argv[5]), username);
644
645=== modified file 'src/libusermetricsinput/main.cpp'
646--- src/libusermetricsinput/main.cpp 2013-07-05 15:31:22 +0000
647+++ src/libusermetricsinput/main.cpp 2013-09-04 17:46:16 +0000
648@@ -44,7 +44,11 @@
649 QString username(QString::fromUtf8(argv[4]));
650
651 MetricManagerPtr manager(MetricManager::getInstance());
652- MetricPtr metric(manager->add(dataSourceId, formatString, emptyDataString));
653+ MetricPtr metric(
654+ manager->add(
655+ MetricParameters(dataSourceId).formatString(formatString).emptyDataString(
656+ emptyDataString).type(
657+ username.isEmpty() ? SYSTEM : USER)));
658 MetricUpdatePtr update(metric->update(username));
659
660 for (int i(5); i < argc; ++i) {
661
662=== modified file 'src/libusermetricsinput/usermetricsinput.cpp'
663--- src/libusermetricsinput/usermetricsinput.cpp 2013-07-10 15:23:18 +0000
664+++ src/libusermetricsinput/usermetricsinput.cpp 2013-09-04 17:46:16 +0000
665@@ -48,15 +48,103 @@
666 }
667 }
668
669+UserMetricsInputMetricParameters usermetricsinput_metricparameters_new(
670+ const char *dataSourceId) {
671+ try {
672+ return reinterpret_cast<UserMetricsInputMetricParameters>(new MetricParameters(
673+ dataSourceId));
674+ } catch (exception &e) {
675+ fprintf(stderr, "Error creating MetricParameters: %s\n", e.what());
676+ }
677+ return nullptr;
678+}
679+
680+void usermetricsinput_metricparameters_set_format_string(
681+ UserMetricsInputMetricParameters p, const char *formatString) {
682+ try {
683+ MetricParameters *metricParameters(
684+ reinterpret_cast<MetricParameters*>(p));
685+ metricParameters->formatString(formatString);
686+ } catch (exception &e) {
687+ fprintf(stderr, "Error setting format string: %s\n", e.what());
688+ }
689+}
690+
691+void usermetricsinput_metricparameters_set_empty_data_string(
692+ UserMetricsInputMetricParameters p, const char *emptyDataString) {
693+ try {
694+ MetricParameters *metricParameters(
695+ reinterpret_cast<MetricParameters*>(p));
696+ metricParameters->emptyDataString(emptyDataString);
697+ } catch (exception &e) {
698+ fprintf(stderr, "Error setting empty data string: %s\n", e.what());
699+ }
700+}
701+
702+void usermetricsinput_metricparameters_set_text_domain(
703+ UserMetricsInputMetricParameters p, const char *textDomain) {
704+ try {
705+ MetricParameters *metricParameters(
706+ reinterpret_cast<MetricParameters*>(p));
707+ metricParameters->textDomain(textDomain);
708+ } catch (exception &e) {
709+ fprintf(stderr, "Error setting empty data string: %s\n", e.what());
710+ }
711+}
712+
713+void usermetricsinput_metricparameters_set_minimum(
714+ UserMetricsInputMetricParameters p, double minimum) {
715+ try {
716+ MetricParameters *metricParameters(
717+ reinterpret_cast<MetricParameters*>(p));
718+ metricParameters->minimum(minimum);
719+ } catch (exception &e) {
720+ fprintf(stderr, "Error setting minimum: %s\n", e.what());
721+ }
722+}
723+
724+void usermetricsinput_metricparameters_set_maximum(
725+ UserMetricsInputMetricParameters p, double maximum) {
726+ try {
727+ MetricParameters *metricParameters(
728+ reinterpret_cast<MetricParameters*>(p));
729+ metricParameters->maximum(maximum);
730+ } catch (exception &e) {
731+ fprintf(stderr, "Error setting maximum: %s\n", e.what());
732+ }
733+}
734+
735+void usermetricsinput_metricparameters_set_type(
736+ UserMetricsInputMetricParameters p, USERMETRICSINPUT_METRICTYPE t) {
737+ try {
738+ MetricParameters *metricParameters(
739+ reinterpret_cast<MetricParameters*>(p));
740+ MetricType type(USER);
741+ if (t == METRIC_TYPE_SYSTEM) {
742+ type = SYSTEM;
743+ }
744+ metricParameters->type(type);
745+ } catch (exception &e) {
746+ fprintf(stderr, "Error setting maximum: %s\n", e.what());
747+ }
748+}
749+
750+void usermetricsinput_metricparameters_delete(
751+ UserMetricsInputMetricParameters metricParameters) {
752+ try {
753+ delete reinterpret_cast<MetricParameters*>(metricParameters);
754+ } catch (exception &e) {
755+ fprintf(stderr, "Error deleting MetricParameters: %s\n", e.what());
756+ }
757+}
758+
759 UserMetricsInputMetric usermetricsinput_metricmanager_add(
760- UserMetricsInputMetricManager m, const char *dataSourceId,
761- const char *formatString, const char *emptyDataString,
762- const char *textDomain) {
763+ UserMetricsInputMetricManager m, UserMetricsInputMetricParameters p) {
764 try {
765 MetricManager *metricManager(reinterpret_cast<MetricManager*>(m));
766- MetricPtr metric(
767- metricManager->add(dataSourceId, formatString, emptyDataString,
768- textDomain));
769+ MetricParameters *metricParameters(
770+ reinterpret_cast<MetricParameters*>(p));
771+ MetricPtr metric(metricManager->add(*metricParameters));
772 return reinterpret_cast<UserMetricsInputMetric>(metric.data());
773 } catch (exception &e) {
774 fprintf(stderr, "Error adding Metric: %s\n", e.what());
775
776=== modified file 'src/libusermetricsinput/usermetricsinput.h'
777--- src/libusermetricsinput/usermetricsinput.h 2013-07-10 15:37:18 +0000
778+++ src/libusermetricsinput/usermetricsinput.h 2013-09-04 17:46:16 +0000
779@@ -37,12 +37,21 @@
780 extern "C" {
781 #endif
782
783+enum USERMETRICSINPUT_METRICTYPE {
784+ METRIC_TYPE_USER, METRIC_TYPE_SYSTEM
785+};
786+
787 /**
788 * @brief A central place for registering user metrics.
789 */
790 typedef void* UserMetricsInputMetricManager;
791
792 /**
793+ * @brief Parameters for constructing a metric.
794+ */
795+typedef void* UserMetricsInputMetricParameters;
796+
797+/**
798 * @brief A single user metric, e.g. "number of e-mails today" or "photos taken today".
799 */
800 typedef void* UserMetricsInputMetric;
801@@ -52,7 +61,6 @@
802 */
803 typedef void* UserMetricsInputMetricUpdate;
804
805-
806 /**
807 * @brief Construct a new UserMetricsInputMetricManager
808 *
809@@ -65,27 +73,105 @@
810 * @brief Free a UserMetricsInputMetricManager
811 *
812 * @param metricManager The UserMetricsInputMetricManager to free
813- */
814-USERMETRICSINPUT_EXPORT
815+ */USERMETRICSINPUT_EXPORT
816 void usermetricsinput_metricmanager_delete(
817 UserMetricsInputMetricManager metricManager);
818+/**
819+ * @brief Construct a new UserMetricsInputMetricParameters
820+ *
821+ * @param dataSourceId The unique ID of the data source, e.g. "facebook"
822+ *
823+ * Must be freed with #usermetricsinput_metricparameters_delete
824+ */
825+USERMETRICSINPUT_EXPORT
826+UserMetricsInputMetricParameters usermetricsinput_metricparameters_new(
827+ const char *dataSourceId);
828+
829+ /**
830+ * @brief Set the string to print in the output API, e.g. "<b>%1</b> messages received today"
831+ *
832+ * @param metricParameter
833+ * @param formatString
834+ */
835+USERMETRICSINPUT_EXPORT
836+void usermetricsinput_metricparameters_set_format_string(
837+ UserMetricsInputMetricParameters metricParameter,
838+ const char *formatString);
839+
840+/**
841+ * @brief set the string to print in the case of no data, e.g. "No messages received today"
842+ *
843+ * @param metricParameter
844+ * @param emptyDataString
845+ */
846+USERMETRICSINPUT_EXPORT
847+void usermetricsinput_metricparameters_set_empty_data_string(
848+ UserMetricsInputMetricParameters metricParameter,
849+ const char *emptyDataString);
850+
851+/**
852+ * @brief Set the translation domain
853+ *
854+ * @param metricParameter
855+ * @param textDomain
856+ */
857+USERMETRICSINPUT_EXPORT
858+void usermetricsinput_metricparameters_set_text_domain(
859+ UserMetricsInputMetricParameters metricParameter,
860+ const char *textDomain);
861+
862+/**
863+ * @brief Set the minimum display value for this metric
864+ *
865+ * @param metricParameter
866+ * @param minimum
867+ */
868+USERMETRICSINPUT_EXPORT
869+void usermetricsinput_metricparameters_set_minimum(
870+ UserMetricsInputMetricParameters metricParameter, double minimum);
871+
872+/**
873+ * @brief Set the maximum display value for this metric
874+ *
875+ * @param metricParameter
876+ * @param maximum
877+ */
878+USERMETRICSINPUT_EXPORT
879+void usermetricsinput_metricparameters_set_maximum(
880+ UserMetricsInputMetricParameters metricParameter, double maximum);
881+
882+/**
883+ * @brief Set the type of metric this is (user owned or system owned)
884+ *
885+ * @param metricParameter
886+ * @param metricType
887+ */
888+USERMETRICSINPUT_EXPORT
889+void usermetricsinput_metricparameters_set_type(
890+ UserMetricsInputMetricParameters metricParameter,
891+ USERMETRICSINPUT_METRICTYPE metricType);
892+
893+/**
894+ * @brief Free a UserMetricsInputMetricParameters
895+ *
896+ * @param metricParameters The UserMetricsInputMetricManager to free
897+ */
898+USERMETRICSINPUT_EXPORT
899+void usermetricsinput_metricparameters_delete(
900+ UserMetricsInputMetricParameters metricParameters);
901
902 /**
903 * @brief Register a new UserMetricsInputMetric
904 *
905 * @param metricManager
906- * @param dataSourceId The unique ID of the data source, e.g. "facebook"
907- * @param formatString The string to print in the output API, e.g. "<b>%1</b> messages received today"
908- * @param emptyDataString The string to print in the case of no data, e.g. "No messages received today"
909- * @param textDomain The translation domain
910+ * @param metricParameters The parameters of the metric to create
911 *
912 * Do not attempt to delete this object.
913 */
914 USERMETRICSINPUT_EXPORT
915 UserMetricsInputMetric usermetricsinput_metricmanager_add(
916- UserMetricsInputMetricManager metricManager, const char *dataSourceId,
917- const char *formatString, const char *emptyDataString,
918- const char *textDomain);
919+ UserMetricsInputMetricManager metricManager,
920+ UserMetricsInputMetricParameters metricParameters);
921
922 /**
923 * @brief Increment the "today" value for a simple user metric
924@@ -108,7 +194,6 @@
925 USERMETRICSINPUT_EXPORT
926 void usermetricsinput_metric_update_today(UserMetricsInputMetric metric,
927 double value, const char *username);
928-
929 /**
930 * @brief Create an update to a particular metric
931 *
932
933=== modified file 'src/libusermetricsoutput/DataSet.cpp'
934--- src/libusermetricsoutput/DataSet.cpp 2013-07-02 12:16:49 +0000
935+++ src/libusermetricsoutput/DataSet.cpp 2013-09-04 17:46:16 +0000
936@@ -21,8 +21,11 @@
937 using namespace std;
938 using namespace UserMetricsOutput;
939
940-DataSet::DataSet(QObject* parent) :
941- QObject(parent) {
942+DataSet::DataSet(DataSourcePtr dataSource, QObject* parent) :
943+ QObject(parent), m_dataSource(dataSource) {
944+
945+ connect(m_dataSource.data(), SIGNAL(optionsChanged(const QVariantMap &)),
946+ this, SLOT(optionsChanged(const QVariantMap &)));
947 }
948
949 DataSet::~DataSet() {
950@@ -41,21 +44,41 @@
951 }
952
953 void DataSet::setData(const QVariantList &data) {
954- m_data = data;
955+ m_originalData = data;
956+ scaleData();
957+}
958+
959+void DataSet::scaleData() {
960+ m_data = m_originalData;
961+
962+ const QVariantMap &options(m_dataSource->options());
963+
964+ bool hasMinimum(options.contains("minimum"));
965+ bool hasMaximum(options.contains("maximum"));
966
967 double min(numeric_limits<double>::max());
968 double max(numeric_limits<double>::min());
969
970- for (QVariant &variant : m_data) {
971- if (variant.type() == QVariant::String) {
972- variant = QVariant();
973- } else if (variant.type() == QVariant::Double) {
974- double value(variant.toDouble());
975- if (value < min) {
976- min = value;
977- }
978- if (value > max) {
979- max = value;
980+ if (hasMinimum) {
981+ min = options["minimum"].toDouble();
982+ }
983+ if (hasMaximum) {
984+ max = options["maximum"].toDouble();
985+ }
986+
987+ // if we need to find either the max or the min
988+ if (!hasMinimum || !hasMaximum) {
989+ for (QVariant &variant : m_data) {
990+ if (variant.type() == QVariant::String) {
991+ variant = QVariant();
992+ } else if (variant.type() == QVariant::Double) {
993+ double value(variant.toDouble());
994+ if (!hasMinimum && value < min) {
995+ min = value;
996+ }
997+ if (!hasMaximum && value > max) {
998+ max = value;
999+ }
1000 }
1001 }
1002 }
1003@@ -75,6 +98,12 @@
1004 if (variant.type() == QVariant::Double) {
1005 if (min != max) {
1006 double value(variant.toDouble());
1007+ if (hasMaximum && value > max) {
1008+ value = max;
1009+ }
1010+ if (hasMinimum && value < min) {
1011+ value = min;
1012+ }
1013 variant = (value - min) / (max - min);
1014 } else {
1015 variant = 0.5;
1016@@ -96,3 +125,8 @@
1017 setLastUpdated(QDateTime::fromTime_t(lastUpdated).date());
1018 setData(data);
1019 }
1020+
1021+void DataSet::optionsChanged(const QVariantMap &options) {
1022+ Q_UNUSED(options);
1023+ scaleData();
1024+}
1025
1026=== modified file 'src/libusermetricsoutput/DataSet.h'
1027--- src/libusermetricsoutput/DataSet.h 2013-07-02 08:47:29 +0000
1028+++ src/libusermetricsoutput/DataSet.h 2013-09-04 17:46:16 +0000
1029@@ -20,6 +20,7 @@
1030 #define USERMETRICSOUTPUT_DATASET_H_
1031
1032 #include <libusermetricsoutput/ColorThemeImpl.h>
1033+#include <libusermetricsoutput/DataSource.h>
1034
1035 #include <QtCore/QSharedPointer>
1036 #include <QtCore/QVariantList>
1037@@ -41,7 +42,7 @@
1038 Q_PROPERTY(const QVariant head READ head NOTIFY headChanged FINAL)
1039
1040 public:
1041- explicit DataSet(QObject* parent = 0);
1042+ explicit DataSet(DataSourcePtr dataSource, QObject* parent = 0);
1043
1044 virtual ~DataSet();
1045
1046@@ -58,6 +59,8 @@
1047
1048 void setLastUpdated(const QDate &lastUpdated);
1049
1050+ void optionsChanged(const QVariantMap &options);
1051+
1052 Q_SIGNALS:
1053 void lastUpdatedChanged(const QDate &lastUpdated);
1054
1055@@ -66,11 +69,18 @@
1056 void headChanged(const QVariant &head);
1057
1058 protected:
1059+ void scaleData();
1060+
1061+ DataSourcePtr m_dataSource;
1062+
1063 QDate m_lastUpdated;
1064
1065 QVariantList m_data;
1066
1067+ QVariantList m_originalData;
1068+
1069 QVariant m_head;
1070+
1071 };
1072
1073 }
1074
1075=== modified file 'src/libusermetricsoutput/DataSource.cpp'
1076--- src/libusermetricsoutput/DataSource.cpp 2013-07-17 10:22:05 +0000
1077+++ src/libusermetricsoutput/DataSource.cpp 2013-09-04 17:46:16 +0000
1078@@ -24,7 +24,7 @@
1079 DataSource::DataSource(const QString &localeDir, QObject *parent) :
1080 QObject(parent), m_formatString(""), m_formatStringTr(""), m_emptyDataString(
1081 ""), m_emptyDataStringTr(""), m_textDomain(""), m_localeDir(
1082- localeDir) {
1083+ localeDir), m_type(USER) {
1084
1085 }
1086
1087@@ -83,3 +83,25 @@
1088 textDomainChanged(m_textDomain);
1089 }
1090 }
1091+
1092+MetricType DataSource::type() const {
1093+ return m_type;
1094+}
1095+
1096+void DataSource::setType(const MetricType type) {
1097+ if (type != m_type) {
1098+ m_type = type;
1099+ typeChanged(m_type);
1100+ }
1101+}
1102+
1103+const QVariantMap & DataSource::options() const {
1104+ return m_options;
1105+}
1106+
1107+void DataSource::setOptions(const QVariantMap &options) {
1108+ if (options != m_options) {
1109+ m_options = options;
1110+ optionsChanged(m_options);
1111+ }
1112+}
1113
1114=== modified file 'src/libusermetricsoutput/DataSource.h'
1115--- src/libusermetricsoutput/DataSource.h 2013-07-17 10:22:05 +0000
1116+++ src/libusermetricsoutput/DataSource.h 2013-09-04 17:46:16 +0000
1117@@ -22,6 +22,7 @@
1118 #include <QtCore/QObject>
1119 #include <QtCore/QString>
1120 #include <QtCore/QSharedPointer>
1121+#include <QtCore/QVariantMap>
1122
1123 namespace UserMetricsOutput {
1124
1125@@ -29,6 +30,10 @@
1126
1127 typedef QSharedPointer<DataSource> DataSourcePtr;
1128
1129+enum MetricType {
1130+ USER, SYSTEM
1131+};
1132+
1133 class DataSource: public QObject {
1134 Q_OBJECT
1135
1136@@ -38,6 +43,10 @@
1137
1138 Q_PROPERTY(QString textDomain READ textDomain WRITE setTextDomain NOTIFY textDomainChanged FINAL)
1139
1140+Q_PROPERTY(MetricType type READ type WRITE setType NOTIFY typeChanged FINAL)
1141+
1142+Q_PROPERTY(QVariantMap options READ options WRITE setOptions NOTIFY optionsChanged)
1143+
1144 public:
1145 explicit DataSource(const QString &localeDir = LOCALEDIR, QObject *parent =
1146 0);
1147@@ -50,6 +59,10 @@
1148
1149 const QString & textDomain() const;
1150
1151+ MetricType type() const;
1152+
1153+ const QVariantMap & options() const;
1154+
1155 public Q_SLOTS:
1156 void setFormatString(const QString &formatString);
1157
1158@@ -57,6 +70,10 @@
1159
1160 void setTextDomain(const QString &textDomain);
1161
1162+ void setType(const MetricType type);
1163+
1164+ void setOptions(const QVariantMap &options);
1165+
1166 Q_SIGNALS:
1167 void formatStringChanged(const QString &formatString);
1168
1169@@ -64,6 +81,10 @@
1170
1171 void textDomainChanged(const QString &textDomain);
1172
1173+ void typeChanged(const MetricType type);
1174+
1175+ void optionsChanged(const QVariantMap &options);
1176+
1177 protected:
1178 void updateFormatStringTranslation();
1179
1180@@ -80,6 +101,10 @@
1181 QString m_textDomain;
1182
1183 QString m_localeDir;
1184+
1185+ MetricType m_type;
1186+
1187+ QVariantMap m_options;
1188 };
1189
1190 }
1191
1192=== modified file 'src/libusermetricsoutput/SyncedDataSet.cpp'
1193--- src/libusermetricsoutput/SyncedDataSet.cpp 2013-07-02 11:48:18 +0000
1194+++ src/libusermetricsoutput/SyncedDataSet.cpp 2013-09-04 17:46:16 +0000
1195@@ -22,8 +22,8 @@
1196
1197 SyncedDataSet::SyncedDataSet(
1198 QSharedPointer<com::canonical::usermetrics::DataSet> interface,
1199- QObject *parent) :
1200- DataSet(parent), m_interface(interface) {
1201+ DataSourcePtr dataSource, QObject *parent) :
1202+ DataSet(dataSource, parent), m_interface(interface) {
1203
1204 connect(m_interface.data(), SIGNAL(updated(uint, const QVariantList &)),
1205 this, SLOT(update(uint, const QVariantList &)));
1206
1207=== modified file 'src/libusermetricsoutput/SyncedDataSet.h'
1208--- src/libusermetricsoutput/SyncedDataSet.h 2013-07-01 11:17:17 +0000
1209+++ src/libusermetricsoutput/SyncedDataSet.h 2013-09-04 17:46:16 +0000
1210@@ -30,7 +30,7 @@
1211 public:
1212 explicit SyncedDataSet(
1213 QSharedPointer<com::canonical::usermetrics::DataSet> interface,
1214- QObject *parent = 0);
1215+ DataSourcePtr dataSource, QObject *parent = 0);
1216
1217 virtual ~SyncedDataSet();
1218
1219
1220=== modified file 'src/libusermetricsoutput/SyncedDataSource.cpp'
1221--- src/libusermetricsoutput/SyncedDataSource.cpp 2013-07-17 10:22:05 +0000
1222+++ src/libusermetricsoutput/SyncedDataSource.cpp 2013-09-04 17:46:16 +0000
1223@@ -31,10 +31,24 @@
1224 this, SLOT(setEmptyDataString(const QString &)));
1225 connect(m_interface.data(), SIGNAL(textDomainChanged(const QString &)),
1226 this, SLOT(setTextDomain(const QString &)));
1227+ connect(m_interface.data(), SIGNAL(metricTypeChanged(uint)), this,
1228+ SLOT(setTypeUint(uint)));
1229+ connect(m_interface.data(), SIGNAL(optionsChanged(const QVariantMap &)),
1230+ this, SLOT(setOptions(const QVariantMap &)));
1231 setFormatString(m_interface->formatString());
1232 setEmptyDataString(m_interface->emptyDataString());
1233 setTextDomain(m_interface->textDomain());
1234+ setTypeUint(m_interface->metricType());
1235+ setOptions(m_interface->options());
1236 }
1237
1238 SyncedDataSource::~SyncedDataSource() {
1239 }
1240+
1241+void SyncedDataSource::setTypeUint(uint t) {
1242+ MetricType type(USER);
1243+ if (t == SYSTEM) {
1244+ type = SYSTEM;
1245+ }
1246+ setType(type);
1247+}
1248
1249=== modified file 'src/libusermetricsoutput/SyncedDataSource.h'
1250--- src/libusermetricsoutput/SyncedDataSource.h 2013-07-17 10:22:05 +0000
1251+++ src/libusermetricsoutput/SyncedDataSource.h 2013-09-04 17:46:16 +0000
1252@@ -34,6 +34,9 @@
1253
1254 virtual ~SyncedDataSource();
1255
1256+protected Q_SLOTS:
1257+ void setTypeUint(uint type);
1258+
1259 protected:
1260 QSharedPointer<com::canonical::usermetrics::DataSource> m_interface;
1261 };
1262
1263=== modified file 'src/libusermetricsoutput/SyncedUserData.cpp'
1264--- src/libusermetricsoutput/SyncedUserData.cpp 2013-07-17 11:40:21 +0000
1265+++ src/libusermetricsoutput/SyncedUserData.cpp 2013-09-04 17:46:16 +0000
1266@@ -18,6 +18,7 @@
1267
1268 #include <libusermetricsoutput/SyncedDataSet.h>
1269 #include <libusermetricsoutput/SyncedUserData.h>
1270+#include <libusermetricsoutput/UserMetricsStore.h>
1271 #include <libusermetricscommon/DataSetInterface.h>
1272 #include <libusermetricscommon/DBusPaths.h>
1273
1274@@ -25,42 +26,58 @@
1275 using namespace UserMetricsCommon;
1276 using namespace UserMetricsOutput;
1277
1278-SyncedUserData::SyncedUserData(
1279+SyncedUserData::SyncedUserData(UserMetricsStore &userMetricsStore,
1280 QSharedPointer<com::canonical::usermetrics::UserData> interface,
1281 QObject *parent) :
1282- UserData(parent), m_interface(interface) {
1283-
1284- connect(m_interface.data(),
1285+ UserData(userMetricsStore, parent) {
1286+ attachUserData(interface);
1287+}
1288+
1289+SyncedUserData::~SyncedUserData() {
1290+}
1291+
1292+void SyncedUserData::attachUserData(
1293+ QSharedPointer<com::canonical::usermetrics::UserData> interface) {
1294+ if (m_userDatas.contains(interface)) {
1295+ return;
1296+ }
1297+
1298+ m_userDatas.insert(interface);
1299+
1300+ connect(interface.data(),
1301 SIGNAL(dataSetAdded(const QString &, const QDBusObjectPath &)),
1302 this, SLOT(addDataSet(const QString &, const QDBusObjectPath &)));
1303
1304- connect(m_interface.data(),
1305+ connect(interface.data(),
1306 SIGNAL(dataSetRemoved(const QString &, const QDBusObjectPath &)),
1307 this,
1308 SLOT(removeDataSet(const QString &, const QDBusObjectPath &)));
1309
1310- for (const QDBusObjectPath &path : m_interface->dataSets()) {
1311+ for (const QDBusObjectPath &path : interface->dataSets()) {
1312
1313 QSharedPointer<canonical::usermetrics::DataSet> dataSet(
1314 new canonical::usermetrics::DataSet(DBusPaths::serviceName(),
1315- path.path(), m_interface->connection()));
1316+ path.path(), interface->connection()));
1317
1318- QString dataSource(dataSet->dataSource());
1319- insert(dataSource, DataSetPtr(new SyncedDataSet(dataSet)));
1320+ QString dataSourceId(dataSet->dataSource());
1321+ insert(dataSourceId,
1322+ DataSetPtr(
1323+ new SyncedDataSet(dataSet,
1324+ m_userMetricsStore.dataSource(dataSourceId))));
1325 }
1326-
1327-}
1328-
1329-SyncedUserData::~SyncedUserData() {
1330 }
1331
1332 void SyncedUserData::addDataSet(const QString &dataSourceName,
1333 const QDBusObjectPath &path) {
1334 QSharedPointer<canonical::usermetrics::DataSet> dataSet(
1335 new canonical::usermetrics::DataSet(DBusPaths::serviceName(),
1336- path.path(), m_interface->connection()));
1337+ path.path(), (*m_userDatas.begin())->connection()));
1338
1339- insert(dataSourceName, DataSetPtr(new SyncedDataSet(dataSet)));
1340+ QString dataSourceId(dataSet->dataSource());
1341+ insert(dataSourceName,
1342+ DataSetPtr(
1343+ new SyncedDataSet(dataSet,
1344+ m_userMetricsStore.dataSource(dataSourceId))));
1345 }
1346
1347 void SyncedUserData::removeDataSet(const QString &dataSetName,
1348
1349=== modified file 'src/libusermetricsoutput/SyncedUserData.h'
1350--- src/libusermetricsoutput/SyncedUserData.h 2013-07-01 11:17:17 +0000
1351+++ src/libusermetricsoutput/SyncedUserData.h 2013-09-04 17:46:16 +0000
1352@@ -19,21 +19,27 @@
1353 #ifndef USERMETRICSOUTPUT_SYNCEDUSERDATA_H_
1354 #define USERMETRICSOUTPUT_SYNCEDUSERDATA_H_
1355
1356+#include <QSet>
1357 #include <libusermetricsoutput/UserData.h>
1358 #include <libusermetricscommon/UserDataInterface.h>
1359
1360 namespace UserMetricsOutput {
1361
1362+class UserMetricsStore;
1363+
1364 class SyncedUserData: public UserData {
1365 Q_OBJECT
1366
1367 public:
1368- explicit SyncedUserData(
1369+ explicit SyncedUserData(UserMetricsStore &userMetricsStore,
1370 QSharedPointer<com::canonical::usermetrics::UserData> interface,
1371 QObject *parent = 0);
1372
1373 virtual ~SyncedUserData();
1374
1375+ void attachUserData(
1376+ QSharedPointer<com::canonical::usermetrics::UserData> interface);
1377+
1378 public Q_SLOTS:
1379 void addDataSet(const QString &dataSourceName, const QDBusObjectPath &path);
1380
1381@@ -41,7 +47,7 @@
1382 const QDBusObjectPath &path);
1383
1384 protected:
1385- QSharedPointer<com::canonical::usermetrics::UserData> m_interface;
1386+ QSet<QSharedPointer<com::canonical::usermetrics::UserData>> m_userDatas;
1387 };
1388
1389 }
1390
1391=== modified file 'src/libusermetricsoutput/SyncedUserMetricsStore.cpp'
1392--- src/libusermetricsoutput/SyncedUserMetricsStore.cpp 2013-07-17 11:40:21 +0000
1393+++ src/libusermetricsoutput/SyncedUserMetricsStore.cpp 2013-09-04 17:46:16 +0000
1394@@ -21,7 +21,6 @@
1395 #include <libusermetricsoutput/SyncedDataSource.h>
1396
1397 #include <libusermetricscommon/DataSourceInterface.h>
1398-#include <libusermetricscommon/UserDataInterface.h>
1399 #include <libusermetricscommon/DBusPaths.h>
1400
1401 using namespace com;
1402@@ -77,6 +76,8 @@
1403 DataSourcePtr(new SyncedDataSource(dataSource, m_localeDir)));
1404 }
1405
1406+ QSharedPointer<canonical::usermetrics::UserData> systemData;
1407+
1408 for (const QDBusObjectPath &path : m_interface.userDatas()) {
1409
1410 QSharedPointer<canonical::usermetrics::UserData> userData(
1411@@ -84,24 +85,55 @@
1412 path.path(), m_interface.connection()));
1413
1414 QString username(userData->username());
1415- insert(username, UserDataPtr(new SyncedUserData(userData)));
1416+ if (username == "") {
1417+ systemData = userData;
1418+ continue;
1419+ }
1420+ insert(username, UserDataPtr(new SyncedUserData(*this, userData)));
1421+ }
1422+
1423+ // if we have system data we must attach it to each of the user datas
1424+ if (!systemData.isNull()) {
1425+ attachSystemData(systemData);
1426 }
1427
1428 connectionEstablished();
1429 }
1430
1431+void SyncedUserMetricsStore::attachSystemData(
1432+ QSharedPointer<canonical::usermetrics::UserData> systemData) {
1433+ for (UserDataPtr userData : m_userData.values()) {
1434+ SyncedUserData *syncedData = qobject_cast<SyncedUserData *>(
1435+ userData.data());
1436+ syncedData->attachUserData(systemData);
1437+ }
1438+}
1439+
1440 void SyncedUserMetricsStore::addUserData(const QString &username,
1441 const QDBusObjectPath &path) {
1442
1443 QSharedPointer<canonical::usermetrics::UserData> userData(
1444 new canonical::usermetrics::UserData(DBusPaths::serviceName(),
1445 path.path(), m_interface.connection()));
1446- insert(username, UserDataPtr(new SyncedUserData(userData)));
1447+
1448+ // if we're adding system data for the first time, we must attach it
1449+ // to all of the user datas
1450+ if (username == "") {
1451+ attachSystemData(userData);
1452+ } else {
1453+ insert(username, UserDataPtr(new SyncedUserData(*this, userData)));
1454+ }
1455 }
1456
1457 void SyncedUserMetricsStore::removeUserData(const QString &username,
1458 const QDBusObjectPath &path) {
1459 Q_UNUSED(path);
1460+
1461+ //FIXME Handle system user data being removed
1462+ if (username == "") {
1463+ return;
1464+ }
1465+
1466 m_dataSources.remove(username);
1467 }
1468
1469
1470=== modified file 'src/libusermetricsoutput/SyncedUserMetricsStore.h'
1471--- src/libusermetricsoutput/SyncedUserMetricsStore.h 2013-07-17 10:22:05 +0000
1472+++ src/libusermetricsoutput/SyncedUserMetricsStore.h 2013-09-04 17:46:16 +0000
1473@@ -21,6 +21,7 @@
1474
1475 #include <libusermetricsoutput/UserMetricsStore.h>
1476 #include <libusermetricscommon/UserMetricsInterface.h>
1477+#include <libusermetricscommon/UserDataInterface.h>
1478
1479 namespace UserMetricsOutput {
1480
1481@@ -48,10 +49,14 @@
1482 void sync();
1483
1484 protected:
1485+ void attachSystemData(
1486+ QSharedPointer<com::canonical::usermetrics::UserData> systemData);
1487+
1488 com::canonical::UserMetrics m_interface;
1489
1490 QString m_localeDir;
1491-};
1492+}
1493+;
1494
1495 }
1496
1497
1498=== modified file 'src/libusermetricsoutput/UserData.cpp'
1499--- src/libusermetricsoutput/UserData.cpp 2013-07-17 11:40:21 +0000
1500+++ src/libusermetricsoutput/UserData.cpp 2013-09-04 17:46:16 +0000
1501@@ -17,11 +17,12 @@
1502 */
1503
1504 #include <libusermetricsoutput/UserData.h>
1505+#include <libusermetricsoutput/UserMetricsStore.h>
1506
1507 using namespace UserMetricsOutput;
1508
1509-UserData::UserData(QObject *parent) :
1510- QObject(parent) {
1511+UserData::UserData(UserMetricsStore &userMetricsStore, QObject *parent) :
1512+ QObject(parent), m_userMetricsStore(userMetricsStore) {
1513 }
1514
1515 UserData::~UserData() {
1516
1517=== modified file 'src/libusermetricsoutput/UserData.h'
1518--- src/libusermetricsoutput/UserData.h 2013-07-17 08:58:12 +0000
1519+++ src/libusermetricsoutput/UserData.h 2013-09-04 17:46:16 +0000
1520@@ -26,6 +26,7 @@
1521 namespace UserMetricsOutput {
1522
1523 class UserData;
1524+class UserMetricsStore;
1525
1526 typedef QSharedPointer<UserData> UserDataPtr;
1527
1528@@ -39,7 +40,7 @@
1529
1530 typedef DataSetMap::const_iterator const_iterator;
1531
1532- explicit UserData(QObject *parent = 0);
1533+ explicit UserData(UserMetricsStore &userMetricsStore, QObject *parent = 0);
1534
1535 virtual ~UserData();
1536
1537@@ -54,6 +55,8 @@
1538
1539 protected:
1540 DataSetMap m_dataSets;
1541+
1542+ UserMetricsStore &m_userMetricsStore;
1543 };
1544
1545 }
1546
1547=== modified file 'src/usermetricsservice/DBusDataSource.cpp'
1548--- src/usermetricsservice/DBusDataSource.cpp 2013-07-05 15:31:22 +0000
1549+++ src/usermetricsservice/DBusDataSource.cpp 2013-09-04 17:46:16 +0000
1550@@ -106,3 +106,127 @@
1551 m_adaptor->textDomainChanged(textDomain);
1552 }
1553 }
1554+
1555+unsigned int DBusDataSource::metricType() const {
1556+ DataSource dataSource;
1557+ DataSource::findById(m_id, &dataSource);
1558+ return dataSource.type();
1559+}
1560+
1561+void DBusDataSource::setMetricType(unsigned int type) {
1562+ DataSource dataSource;
1563+ DataSource::findById(m_id, &dataSource);
1564+ if (type != dataSource.type()) {
1565+ dataSource.setType(type);
1566+ if (!dataSource.save()) {
1567+ throw logic_error(_("Could not save data source"));
1568+ }
1569+ m_adaptor->metricTypeChanged(type);
1570+ }
1571+}
1572+
1573+QVariantMap DBusDataSource::generateOptions(
1574+ const DataSource &dataSource) const {
1575+ QVariantMap options;
1576+ if (dataSource.hasMinimum()) {
1577+ options["minimum"] = dataSource.minimum();
1578+ }
1579+ if (dataSource.hasMaximum()) {
1580+ options["maximum"] = dataSource.maximum();
1581+ }
1582+ return options;
1583+}
1584+
1585+bool DBusDataSource::hasMinimum() const {
1586+ DataSource dataSource;
1587+ DataSource::findById(m_id, &dataSource);
1588+ return dataSource.hasMinimum();
1589+}
1590+
1591+void DBusDataSource::setMinimum(double minimum) {
1592+ DataSource dataSource;
1593+ DataSource::findById(m_id, &dataSource);
1594+ bool changed(false);
1595+ if (!dataSource.hasMinimum()) {
1596+ dataSource.setHasMinimum(true);
1597+ changed = true;
1598+ }
1599+ if (dataSource.minimum() != minimum) {
1600+ dataSource.setMinimum(minimum);
1601+ changed = true;
1602+ }
1603+ if (changed) {
1604+ if (!dataSource.save()) {
1605+ throw logic_error(_("Could not save data source"));
1606+ }
1607+ m_adaptor->optionsChanged(generateOptions(dataSource));
1608+ }
1609+}
1610+
1611+double DBusDataSource::minimum() const {
1612+ DataSource dataSource;
1613+ DataSource::findById(m_id, &dataSource);
1614+ return dataSource.minimum();
1615+}
1616+
1617+void DBusDataSource::noMinimum() {
1618+ DataSource dataSource;
1619+ DataSource::findById(m_id, &dataSource);
1620+ if (dataSource.hasMinimum()) {
1621+ dataSource.setHasMinimum(false);
1622+ if (!dataSource.save()) {
1623+ throw logic_error(_("Could not save data source"));
1624+ }
1625+ m_adaptor->optionsChanged(generateOptions(dataSource));
1626+ }
1627+}
1628+
1629+bool DBusDataSource::hasMaximum() const {
1630+ DataSource dataSource;
1631+ DataSource::findById(m_id, &dataSource);
1632+ return dataSource.hasMaximum();
1633+}
1634+
1635+void DBusDataSource::setMaximum(double maximum) {
1636+ DataSource dataSource;
1637+ DataSource::findById(m_id, &dataSource);
1638+ bool changed(false);
1639+ if (!dataSource.hasMaximum()) {
1640+ dataSource.setHasMaximum(true);
1641+ changed = true;
1642+ }
1643+ if (dataSource.maximum() != maximum) {
1644+ dataSource.setMaximum(maximum);
1645+ changed = true;
1646+ }
1647+ if (changed) {
1648+ if (!dataSource.save()) {
1649+ throw logic_error(_("Could not save data source"));
1650+ }
1651+ m_adaptor->optionsChanged(generateOptions(dataSource));
1652+ }
1653+}
1654+
1655+double DBusDataSource::maximum() const {
1656+ DataSource dataSource;
1657+ DataSource::findById(m_id, &dataSource);
1658+ return dataSource.maximum();
1659+}
1660+
1661+void DBusDataSource::noMaximum() {
1662+ DataSource dataSource;
1663+ DataSource::findById(m_id, &dataSource);
1664+ if (dataSource.hasMaximum()) {
1665+ dataSource.setHasMaximum(false);
1666+ if (!dataSource.save()) {
1667+ throw logic_error(_("Could not save data source"));
1668+ }
1669+ m_adaptor->optionsChanged(generateOptions(dataSource));
1670+ }
1671+}
1672+
1673+QVariantMap DBusDataSource::options() const {
1674+ DataSource dataSource;
1675+ DataSource::findById(m_id, &dataSource);
1676+ return generateOptions(dataSource);
1677+}
1678
1679=== modified file 'src/usermetricsservice/DBusDataSource.h'
1680--- src/usermetricsservice/DBusDataSource.h 2013-07-03 12:29:56 +0000
1681+++ src/usermetricsservice/DBusDataSource.h 2013-09-04 17:46:16 +0000
1682@@ -44,6 +44,10 @@
1683
1684 Q_PROPERTY(QString textDomain READ textDomain WRITE setTextDomain)
1685
1686+Q_PROPERTY(unsigned int metricType READ metricType WRITE setMetricType)
1687+
1688+Q_PROPERTY(QVariantMap options READ options)
1689+
1690 public:
1691 DBusDataSource(int id, const QString &name, QDBusConnection &dbusConnection,
1692 QObject *parent = 0);
1693@@ -66,9 +70,33 @@
1694
1695 void setTextDomain(const QString &textDomain);
1696
1697+ unsigned int metricType() const;
1698+
1699+ void setMetricType(unsigned int type);
1700+
1701+ bool hasMinimum() const;
1702+
1703+ void noMinimum();
1704+
1705+ double minimum() const;
1706+
1707+ void setMinimum(double minimum);
1708+
1709+ bool hasMaximum() const;
1710+
1711+ void noMaximum();
1712+
1713+ double maximum() const;
1714+
1715+ void setMaximum(double maximum);
1716+
1717+ QVariantMap options() const;
1718+
1719 protected:
1720 void lookupDataSource(DataSource *dataSource) const;
1721
1722+ QVariantMap generateOptions(const DataSource &dataSource) const;
1723+
1724 QDBusConnection m_dbusConnection;
1725
1726 QScopedPointer<DataSourceAdaptor> m_adaptor;
1727
1728=== modified file 'src/usermetricsservice/DBusUserMetrics.cpp'
1729--- src/usermetricsservice/DBusUserMetrics.cpp 2013-08-15 09:06:26 +0000
1730+++ src/usermetricsservice/DBusUserMetrics.cpp 2013-09-04 17:46:16 +0000
1731@@ -40,7 +40,6 @@
1732 QSharedPointer<DateFactory> dateFactory, QObject *parent) :
1733 QObject(parent), m_dbusConnection(dbusConnection), m_adaptor(
1734 new UserMetricsAdaptor(this)), m_dateFactory(dateFactory) {
1735-
1736 // Database setup
1737 QDjango::registerModel<DataSource>().createTable();
1738 QDjango::registerModel<UserData>().createTable();
1739@@ -124,7 +123,7 @@
1740
1741 QDBusObjectPath DBusUserMetrics::createDataSource(const QString &name,
1742 const QString &formatString, const QString &emptyDataString,
1743- const QString &textDomain) {
1744+ const QString &textDomain, int type, const QVariantMap &options) {
1745 QDjangoQuerySet<DataSource> dataSourcesQuery;
1746 QDjangoQuerySet<DataSource> query(
1747 dataSourcesQuery.filter(
1748@@ -136,11 +135,32 @@
1749
1750 DataSource dataSource;
1751
1752+ bool hasMinimum(options.contains("minimum"));
1753+ bool hasMaximum(options.contains("maximum"));
1754+
1755+ double minimum(0);
1756+ if (hasMinimum) {
1757+ minimum = options["minimum"].toDouble();
1758+ }
1759+ double maximum(0);
1760+ if (hasMaximum) {
1761+ maximum = options["maximum"].toDouble();
1762+ }
1763+
1764 if (query.size() == 0) {
1765 dataSource.setName(name);
1766 dataSource.setFormatString(formatString);
1767 dataSource.setEmptyDataString(emptyDataString);
1768 dataSource.setTextDomain(textDomain);
1769+ dataSource.setType(type);
1770+ if (hasMinimum) {
1771+ dataSource.setMinimum(minimum);
1772+ dataSource.setHasMinimum(true);
1773+ }
1774+ if (hasMaximum) {
1775+ dataSource.setMaximum(maximum);
1776+ dataSource.setHasMaximum(true);
1777+ }
1778
1779 if (!dataSource.save()) {
1780 throw logic_error(_("Could not save data source"));
1781@@ -160,6 +180,25 @@
1782 if (dataSource.textDomain() != textDomain) {
1783 dbusDataSource->setTextDomain(textDomain);
1784 }
1785+ if (dataSource.type() != type) {
1786+ dbusDataSource->setMetricType(type);
1787+ }
1788+ if (dataSource.hasMinimum() != hasMinimum
1789+ || dataSource.minimum() != minimum) {
1790+ if (hasMinimum) {
1791+ dbusDataSource->setMinimum(minimum);
1792+ } else {
1793+ dbusDataSource->noMinimum();
1794+ }
1795+ }
1796+ if (dataSource.hasMaximum() != hasMaximum
1797+ || dataSource.maximum() != maximum) {
1798+ if (hasMaximum) {
1799+ dbusDataSource->setMaximum(maximum);
1800+ } else {
1801+ dbusDataSource->noMaximum();
1802+ }
1803+ }
1804 }
1805
1806 return QDBusObjectPath((*m_dataSources.constFind(dataSource.id()))->path());
1807
1808=== modified file 'src/usermetricsservice/DBusUserMetrics.h'
1809--- src/usermetricsservice/DBusUserMetrics.h 2013-08-15 09:06:26 +0000
1810+++ src/usermetricsservice/DBusUserMetrics.h 2013-09-04 17:46:16 +0000
1811@@ -23,7 +23,7 @@
1812 #include <QtDBus/QtDBus>
1813 #include <QtCore/QScopedPointer>
1814 #include <QtCore/QSharedPointer>
1815-#include <QtCore/QHash>
1816+#include <QtCore/QMap>
1817
1818 class UserMetricsAdaptor;
1819
1820@@ -50,11 +50,12 @@
1821
1822 virtual ~DBusUserMetrics();
1823
1824+public Q_SLOTS:
1825 QList<QDBusObjectPath> dataSources() const;
1826
1827 QDBusObjectPath createDataSource(const QString &name,
1828 const QString &formatString, const QString &emptyDataString,
1829- const QString &textDomain);
1830+ const QString &textDomain, int type, const QVariantMap &options);
1831
1832 QSharedPointer<DBusDataSource> dataSource(const QString &name) const;
1833
1834@@ -64,10 +65,6 @@
1835
1836 QSharedPointer<DBusUserData> userData(const QString &username) const;
1837
1838-public Q_SLOTS:
1839-
1840-Q_SIGNALS:
1841-
1842 protected:
1843 void syncDatabase();
1844
1845@@ -77,9 +74,9 @@
1846
1847 QSharedPointer<UserMetricsCommon::DateFactory> m_dateFactory;
1848
1849- QHash<int, QSharedPointer<DBusDataSource>> m_dataSources;
1850+ QMap<int, QSharedPointer<DBusDataSource>> m_dataSources;
1851
1852- QHash<int, QSharedPointer<DBusUserData>> m_userData;
1853+ QMap<int, QSharedPointer<DBusUserData>> m_userData;
1854 };
1855
1856 }
1857
1858=== modified file 'src/usermetricsservice/database/DataSource.cpp'
1859--- src/usermetricsservice/database/DataSource.cpp 2013-07-03 12:29:56 +0000
1860+++ src/usermetricsservice/database/DataSource.cpp 2013-09-04 17:46:16 +0000
1861@@ -23,7 +23,8 @@
1862 using namespace UserMetricsService;
1863
1864 DataSource::DataSource(QObject *parent) :
1865- QDjangoModel(parent), m_id(0) {
1866+ QDjangoModel(parent), m_id(0), m_type(0), m_hasMinimum(false), m_minimum(
1867+ 0), m_hasMaximum(false), m_maximum(0) {
1868 }
1869
1870 DataSource::~DataSource() {
1871@@ -69,6 +70,46 @@
1872 m_textDomain = textDomain;
1873 }
1874
1875+int DataSource::type() const {
1876+ return m_type;
1877+}
1878+
1879+void DataSource::setType(int type) {
1880+ m_type = type;
1881+}
1882+
1883+bool DataSource::hasMinimum() const {
1884+ return m_hasMinimum;
1885+}
1886+
1887+void DataSource::setHasMinimum(bool hasMinimum) {
1888+ m_hasMinimum = hasMinimum;
1889+}
1890+
1891+double DataSource::minimum() const {
1892+ return m_minimum;
1893+}
1894+
1895+void DataSource::setMinimum(double minimum) {
1896+ m_minimum = minimum;
1897+}
1898+
1899+bool DataSource::hasMaximum() const {
1900+ return m_hasMaximum;
1901+}
1902+
1903+void DataSource::setHasMaximum(bool hasMaximum) {
1904+ m_hasMaximum = hasMaximum;
1905+}
1906+
1907+double DataSource::maximum() const {
1908+ return m_maximum;
1909+}
1910+
1911+void DataSource::setMaximum(double maximum) {
1912+ m_maximum = maximum;
1913+}
1914+
1915 void DataSource::findById(int id, DataSource *dataSource) {
1916 QDjangoQuerySet<DataSource>().get(
1917 QDjangoWhere("id", QDjangoWhere::Equals, id), dataSource);
1918
1919=== modified file 'src/usermetricsservice/database/DataSource.h'
1920--- src/usermetricsservice/database/DataSource.h 2013-07-03 12:29:56 +0000
1921+++ src/usermetricsservice/database/DataSource.h 2013-09-04 17:46:16 +0000
1922@@ -36,6 +36,16 @@
1923
1924 Q_PROPERTY(QString textDomain READ textDomain WRITE setTextDomain)
1925
1926+Q_PROPERTY(int metricType READ type WRITE setType)
1927+
1928+Q_PROPERTY(bool hasMinimum READ hasMinimum WRITE setHasMinimum)
1929+
1930+Q_PROPERTY(double minimum READ minimum WRITE setMinimum)
1931+
1932+Q_PROPERTY(bool hasMaximum READ hasMaximum WRITE setHasMaximum)
1933+
1934+Q_PROPERTY(double maximum READ maximum WRITE setMaximum)
1935+
1936 Q_CLASSINFO("id", "primary_key=true auto_increment=true")
1937
1938 Q_CLASSINFO("name", "unique=true")
1939@@ -71,6 +81,26 @@
1940
1941 void setTextDomain(const QString &textDomain);
1942
1943+ int type() const;
1944+
1945+ void setType(int type);
1946+
1947+ bool hasMinimum() const;
1948+
1949+ void setHasMinimum(bool hasMinimum);
1950+
1951+ double minimum() const;
1952+
1953+ void setMinimum(double minimum);
1954+
1955+ bool hasMaximum() const;
1956+
1957+ void setHasMaximum(bool hasMaximum);
1958+
1959+ double maximum() const;
1960+
1961+ void setMaximum(double maximum);
1962+
1963 protected:
1964 int m_id;
1965
1966@@ -81,6 +111,16 @@
1967 QString m_emptyDataString;
1968
1969 QString m_textDomain;
1970+
1971+ int m_type;
1972+
1973+ bool m_hasMinimum;
1974+
1975+ double m_minimum;
1976+
1977+ bool m_hasMaximum;
1978+
1979+ double m_maximum;
1980 };
1981
1982 }
1983
1984=== modified file 'src/usermetricsservice/main.cpp'
1985--- src/usermetricsservice/main.cpp 2013-07-08 11:40:12 +0000
1986+++ src/usermetricsservice/main.cpp 2013-09-04 17:46:16 +0000
1987@@ -45,7 +45,7 @@
1988 bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
1989 textdomain(GETTEXT_PACKAGE);
1990
1991- QString databaseName("/var/lib/usermetrics/usermetrics3.db");
1992+ QString databaseName("/var/lib/usermetrics/usermetrics4.db");
1993 QStringList arguments(application.arguments());
1994 if (arguments.size() == 2) {
1995 databaseName = arguments.at(1);
1996
1997=== modified file 'tests/unit/libusermetricsinput/TestMetricManagerImpl.cpp'
1998--- tests/unit/libusermetricsinput/TestMetricManagerImpl.cpp 2013-08-15 09:06:26 +0000
1999+++ tests/unit/libusermetricsinput/TestMetricManagerImpl.cpp 2013-09-04 17:46:16 +0000
2000@@ -260,4 +260,101 @@
2001 EXPECT_EQ(QDate::currentDate(), dateTime.date());
2002 }
2003
2004+TEST_F(TestMetricManagerImpl, TestMinimum) {
2005+ MetricManagerPtr manager(new MetricManagerImpl(systemConnection()));
2006+
2007+ MetricPtr metric(
2008+ manager->add(
2009+ MetricParameters("data-source-id").formatString(
2010+ "format string %1").minimum(-5.0)));
2011+
2012+ com::canonical::usermetrics::DataSource dataSourceInterface(
2013+ DBusPaths::serviceName(), DBusPaths::dataSource(1),
2014+ systemConnection());
2015+
2016+ QVariantMap expected;
2017+ expected["minimum"] = -5.0;
2018+ EXPECT_EQ(expected, dataSourceInterface.options());
2019+}
2020+
2021+TEST_F(TestMetricManagerImpl, TestMaximum) {
2022+ MetricManagerPtr manager(new MetricManagerImpl(systemConnection()));
2023+
2024+ MetricPtr metric(
2025+ manager->add(
2026+ MetricParameters("data-source-id").formatString(
2027+ "format string %1").maximum(4.0)));
2028+
2029+ com::canonical::usermetrics::DataSource dataSourceInterface(
2030+ DBusPaths::serviceName(), DBusPaths::dataSource(1),
2031+ systemConnection());
2032+
2033+ QVariantMap expected;
2034+ expected["maximum"] = 4.0;
2035+ EXPECT_EQ(expected, dataSourceInterface.options());
2036+}
2037+
2038+TEST_F(TestMetricManagerImpl, TestMiniumMaximum) {
2039+ MetricManagerPtr manager(new MetricManagerImpl(systemConnection()));
2040+
2041+ MetricPtr metric(
2042+ manager->add(
2043+ MetricParameters("data-source-id").formatString(
2044+ "format string %1").minimum(1.0).maximum(5.0)));
2045+
2046+ com::canonical::usermetrics::DataSource dataSourceInterface(
2047+ DBusPaths::serviceName(), DBusPaths::dataSource(1),
2048+ systemConnection());
2049+
2050+ QVariantMap expected;
2051+ expected["minimum"] = 1.0;
2052+ expected["maximum"] = 5.0;
2053+ EXPECT_EQ(expected, dataSourceInterface.options());
2054+}
2055+
2056+TEST_F(TestMetricManagerImpl, TestDefaultType) {
2057+ MetricManagerPtr manager(new MetricManagerImpl(systemConnection()));
2058+
2059+ MetricPtr metric(
2060+ manager->add(
2061+ MetricParameters("data-source-id").formatString(
2062+ "format string %1")));
2063+
2064+ com::canonical::usermetrics::DataSource dataSourceInterface(
2065+ DBusPaths::serviceName(), DBusPaths::dataSource(1),
2066+ systemConnection());
2067+
2068+ EXPECT_EQ(MetricType::USER, dataSourceInterface.metricType());
2069+}
2070+
2071+TEST_F(TestMetricManagerImpl, TestUserType) {
2072+ MetricManagerPtr manager(new MetricManagerImpl(systemConnection()));
2073+
2074+ MetricPtr metric(
2075+ manager->add(
2076+ MetricParameters("data-source-id").formatString(
2077+ "format string %1").type(MetricType::USER)));
2078+
2079+ com::canonical::usermetrics::DataSource dataSourceInterface(
2080+ DBusPaths::serviceName(), DBusPaths::dataSource(1),
2081+ systemConnection());
2082+
2083+ EXPECT_EQ(MetricType::USER, dataSourceInterface.metricType());
2084+}
2085+
2086+TEST_F(TestMetricManagerImpl, TestSystemType) {
2087+ MetricManagerPtr manager(new MetricManagerImpl(systemConnection()));
2088+
2089+ MetricPtr metric(
2090+ manager->add(
2091+ MetricParameters("data-source-id").formatString(
2092+ "format string %1").type(MetricType::SYSTEM)));
2093+
2094+ com::canonical::usermetrics::DataSource dataSourceInterface(
2095+ DBusPaths::serviceName(), DBusPaths::dataSource(1),
2096+ systemConnection());
2097+
2098+ EXPECT_EQ(MetricType::SYSTEM, dataSourceInterface.metricType());
2099+}
2100+
2101 } // namespace
2102
2103=== modified file 'tests/unit/libusermetricsinput/TestUserMetricInputCAPI.cpp'
2104--- tests/unit/libusermetricsinput/TestUserMetricInputCAPI.cpp 2013-08-15 09:06:26 +0000
2105+++ tests/unit/libusermetricsinput/TestUserMetricInputCAPI.cpp 2013-09-04 17:46:16 +0000
2106@@ -48,9 +48,31 @@
2107 UserMetricsInputMetricManager metricManager =
2108 usermetricsinput_metricmanager_new();
2109
2110+ UserMetricsInputMetricParameters p1 = usermetricsinput_metricparameters_new(
2111+ "data-source-id-capi");
2112+ usermetricsinput_metricparameters_set_format_string(p1,
2113+ "format string c-api %1");
2114+ usermetricsinput_metricparameters_set_empty_data_string(p1,
2115+ "empty data string");
2116+ usermetricsinput_metricparameters_set_text_domain(p1, "text domain");
2117+
2118 UserMetricsInputMetric metric = usermetricsinput_metricmanager_add(
2119- metricManager, "data-source-id-capi", "format string c-api %1",
2120- "empty data string", "text domain");
2121+ metricManager, p1);
2122+ usermetricsinput_metricparameters_delete(p1);
2123+
2124+ UserMetricsInputMetricParameters p2 = usermetricsinput_metricparameters_new(
2125+ "data-source-id-capi-min");
2126+ usermetricsinput_metricparameters_set_format_string(p2,
2127+ "format string c-api %1 min");
2128+ usermetricsinput_metricparameters_set_empty_data_string(p2,
2129+ "empty data string min");
2130+ usermetricsinput_metricparameters_set_text_domain(p2, "text domain min");
2131+ usermetricsinput_metricparameters_set_minimum(p2, -4.0);
2132+ usermetricsinput_metricparameters_set_maximum(p2, 5.0);
2133+ usermetricsinput_metricparameters_set_type(p2, METRIC_TYPE_SYSTEM);
2134+
2135+ usermetricsinput_metricmanager_add(metricManager, p2);
2136+ usermetricsinput_metricparameters_delete(p2);
2137
2138 UserMetricsInputMetricUpdate metricUpdate = usermetricsinput_metric_update(
2139 metric, "username_capi");
2140@@ -64,21 +86,40 @@
2141
2142 {
2143 QList<QDBusObjectPath> dataSources = userMetricsInterface.dataSources();
2144- EXPECT_EQ(1, dataSources.size());
2145- ASSERT_EQ(DBusPaths::dataSource(1), dataSources.first().path());
2146- }
2147-
2148- com::canonical::usermetrics::DataSource dataSourceInterface(
2149- DBusPaths::serviceName(), DBusPaths::dataSource(1), systemConnection());
2150- EXPECT_EQ(QString("data-source-id-capi"), dataSourceInterface.name());
2151- EXPECT_EQ(QString("format string c-api %1"),
2152- dataSourceInterface.formatString());
2153- EXPECT_EQ(QString("empty data string"),
2154- dataSourceInterface.emptyDataString());
2155- EXPECT_EQ(QString("text domain"), dataSourceInterface.textDomain());
2156+ EXPECT_EQ(2, dataSources.size());
2157+ ASSERT_EQ(DBusPaths::dataSource(1), dataSources.at(0).path());
2158+ ASSERT_EQ(DBusPaths::dataSource(2), dataSources.at(1).path());
2159+ }
2160+
2161+ {
2162+ com::canonical::usermetrics::DataSource dataSourceInterface(
2163+ DBusPaths::serviceName(), DBusPaths::dataSource(1),
2164+ systemConnection());
2165+ EXPECT_EQ(QString("data-source-id-capi"), dataSourceInterface.name());
2166+ EXPECT_EQ(QString("format string c-api %1"),
2167+ dataSourceInterface.formatString());
2168+ EXPECT_EQ(QString("empty data string"),
2169+ dataSourceInterface.emptyDataString());
2170+ EXPECT_EQ(QString("text domain"), dataSourceInterface.textDomain());
2171+ EXPECT_EQ(METRIC_TYPE_USER, dataSourceInterface.metricType());
2172+ }
2173+
2174+ {
2175+ com::canonical::usermetrics::DataSource dataSourceInterface(
2176+ DBusPaths::serviceName(), DBusPaths::dataSource(2),
2177+ systemConnection());
2178+ EXPECT_EQ(QString("data-source-id-capi-min"),
2179+ dataSourceInterface.name());
2180+ QVariantMap options;
2181+ options["minimum"] = -4.0;
2182+ options["maximum"] = 5.0;
2183+ EXPECT_EQ(options, dataSourceInterface.options());
2184+ EXPECT_EQ(METRIC_TYPE_SYSTEM, dataSourceInterface.metricType());
2185+ }
2186
2187 com::canonical::usermetrics::UserData userDataInterface(
2188- DBusPaths::serviceName(), DBusPaths::userData(1), systemConnection());
2189+ DBusPaths::serviceName(), DBusPaths::userData(1),
2190+ systemConnection());
2191 EXPECT_EQ(QString("username_capi"), userDataInterface.username());
2192
2193 com::canonical::usermetrics::DataSet dataSetInterface(
2194
2195=== modified file 'tests/unit/libusermetricsoutput/TestDataSet.cpp'
2196--- tests/unit/libusermetricsoutput/TestDataSet.cpp 2013-07-02 12:48:51 +0000
2197+++ tests/unit/libusermetricsoutput/TestDataSet.cpp 2013-09-04 17:46:16 +0000
2198@@ -69,7 +69,9 @@
2199 TEST_P(TestDataSet, SetData) {
2200 TestDataSetParamData testData(GetParam());
2201
2202- DataSet dataSet;
2203+ DataSourcePtr dataSource(new DataSource());
2204+
2205+ DataSet dataSet(dataSource);
2206 dataSet.setData(testData.m_input);
2207
2208 EXPECT_EQ(testData.m_expectedData, dataSet.data());
2209@@ -79,33 +81,33 @@
2210 INSTANTIATE_TEST_CASE_P(ScalesData, TestDataSet,
2211 Values(
2212 TestDataSetParamData(
2213- QVariantList( { -10.0, -5.0, 0.0, 5.0, 10.0 }),
2214- QVariantList( { 0.0, 0.25, 0.5, 0.75, 1.0 }),
2215+ QVariantList( {-10.0, -5.0, 0.0, 5.0, 10.0}),
2216+ QVariantList( {0.0, 0.25, 0.5, 0.75, 1.0}),
2217 QVariant(-10.0))));
2218
2219 INSTANTIATE_TEST_CASE_P(TurnsBlankStringIntoNull, TestDataSet,
2220- Values(TestDataSetParamData(QVariantList( { "" }), QVariantList( {
2221- QVariant() }), QVariant())));
2222+ Values(TestDataSetParamData(QVariantList( {""}), QVariantList( {
2223+ QVariant()}), QVariant())));
2224
2225 INSTANTIATE_TEST_CASE_P(TurnsBlankStringIntoNullWithOtherData, TestDataSet,
2226 Values(
2227- TestDataSetParamData(QVariantList( { 100.0, "", 50.0, 0.0 }),
2228- QVariantList( { 1.0, QVariant(), 0.5, 0.0 }),
2229+ TestDataSetParamData(QVariantList( {100.0, "", 50.0, 0.0}),
2230+ QVariantList( {1.0, QVariant(), 0.5, 0.0}),
2231 QVariant(100.0))));
2232
2233 INSTANTIATE_TEST_CASE_P(TurnsSingleValueInto0Point5, TestDataSet,
2234- Values(TestDataSetParamData(QVariantList( { 127.0 }), QVariantList( {
2235- 0.5 }), QVariant(127.0))));
2236+ Values(TestDataSetParamData(QVariantList( {127.0}), QVariantList( {
2237+ 0.5}), QVariant(127.0))));
2238
2239 INSTANTIATE_TEST_CASE_P(TurnsZeroRangeInto0Point5s, TestDataSet,
2240 Values(
2241- TestDataSetParamData(QVariantList( { 27.0, 27.0 }),
2242- QVariantList( { 0.5, 0.5 }), QVariant(27.0))));
2243+ TestDataSetParamData(QVariantList( {27.0, 27.0}),
2244+ QVariantList( {0.5, 0.5}), QVariant(27.0))));
2245
2246 INSTANTIATE_TEST_CASE_P(TurnsZeroRangeInto0Point5sMoreValues, TestDataSet,
2247 Values(
2248- TestDataSetParamData(QVariantList( { 150.0, 150.0, 150.0 }),
2249- QVariantList( { 0.5, 0.5, 0.5 }), QVariant(150.0))));
2250+ TestDataSetParamData(QVariantList( {150.0, 150.0, 150.0}),
2251+ QVariantList( {0.5, 0.5, 0.5}), QVariant(150.0))));
2252
2253 }
2254 // namespace
2255
2256=== modified file 'tests/unit/libusermetricsoutput/TestSyncedUserMetricsStore.cpp'
2257--- tests/unit/libusermetricsoutput/TestSyncedUserMetricsStore.cpp 2013-08-15 09:06:26 +0000
2258+++ tests/unit/libusermetricsoutput/TestSyncedUserMetricsStore.cpp 2013-09-04 17:46:16 +0000
2259@@ -56,13 +56,13 @@
2260 QDBusObjectPath dataSourcePath1(
2261 userMetricsInterface.createDataSource("data-source-one",
2262 "format string one %1", "empty data string one",
2263- "text domain one"));
2264+ "text domain one", MetricType::USER, QVariantMap()));
2265 ASSERT_EQ(DBusPaths::dataSource(1), dataSourcePath1.path());
2266
2267 QDBusObjectPath dataSourcePath2(
2268 userMetricsInterface.createDataSource("data-source-two",
2269 "format string two %1", "empty data string two",
2270- "text domain two"));
2271+ "text domain two", MetricType::USER, QVariantMap()));
2272 ASSERT_EQ(DBusPaths::dataSource(2), dataSourcePath2.path());
2273
2274 SyncedUserMetricsStore store(systemConnection());
2275@@ -94,7 +94,7 @@
2276 QDBusObjectPath dataSourcePath1(
2277 userMetricsInterface.createDataSource("data-source-one",
2278 "format string one %1", "no data source ones",
2279- "text-domain-one"));
2280+ "text-domain-one", MetricType::USER, QVariantMap()));
2281 ASSERT_EQ(DBusPaths::dataSource(1), dataSourcePath1.path());
2282
2283 SyncedUserMetricsStore store(systemConnection());
2284@@ -120,7 +120,7 @@
2285 QDBusObjectPath dataSourcePath2(
2286 userMetricsInterface.createDataSource("data-source-two",
2287 "format string two %1", "no data source twos",
2288- "text-domain-two"));
2289+ "text-domain-two", MetricType::USER, QVariantMap()));
2290 ASSERT_EQ(DBusPaths::dataSource(2), dataSourcePath2.path());
2291
2292 spy.wait();
2293@@ -226,7 +226,8 @@
2294
2295 QDBusObjectPath twitterPath(
2296 userMetricsInterface.createDataSource("twitter",
2297- "twitter format string", "", ""));
2298+ "twitter format string", "", "", MetricType::USER,
2299+ QVariantMap()));
2300 ASSERT_EQ(DBusPaths::dataSource(1), twitterPath.path());
2301
2302 QDBusObjectPath userDataPath(
2303@@ -234,7 +235,8 @@
2304 ASSERT_EQ(DBusPaths::userData(1), userDataPath.path());
2305
2306 com::canonical::usermetrics::UserData userDataInterface(
2307- DBusPaths::serviceName(), DBusPaths::userData(1), systemConnection());
2308+ DBusPaths::serviceName(), DBusPaths::userData(1),
2309+ systemConnection());
2310 QDBusObjectPath twitterDataPath(userDataInterface.createDataSet("twitter"));
2311 ASSERT_EQ(DBusPaths::dataSet(1), twitterDataPath.path());
2312
2313@@ -242,7 +244,8 @@
2314 QVariantList expected( { 1.0, 0.75, QVariant(), 0.25, 0.0 });
2315
2316 com::canonical::usermetrics::DataSet dataSetInterface(
2317- DBusPaths::serviceName(), DBusPaths::dataSet(1), systemConnection());
2318+ DBusPaths::serviceName(), DBusPaths::dataSet(1),
2319+ systemConnection());
2320 dataSetInterface.update(data);
2321
2322 SyncedUserMetricsStore store(systemConnection());
2323@@ -269,13 +272,14 @@
2324
2325 QDBusObjectPath twitterPath(
2326 userMetricsInterface.createDataSource("twitter",
2327- "twitter format string", "no tweets today", ""));
2328+ "twitter format string", "no tweets today", "",
2329+ MetricType::USER, QVariantMap()));
2330 ASSERT_EQ(DBusPaths::dataSource(1), twitterPath.path());
2331
2332 QDBusObjectPath facebookPath(
2333 userMetricsInterface.createDataSource("facebook",
2334- "facebook format string", "no facebook messages today",
2335- ""));
2336+ "facebook format string", "no facebook messages today", "",
2337+ MetricType::USER, QVariantMap()));
2338 ASSERT_EQ(DBusPaths::dataSource(2), facebookPath.path());
2339
2340 QDBusObjectPath userDataPath(
2341@@ -283,7 +287,8 @@
2342 ASSERT_EQ(DBusPaths::userData(1), userDataPath.path());
2343
2344 com::canonical::usermetrics::UserData userDataInterface(
2345- DBusPaths::serviceName(), DBusPaths::userData(1), systemConnection());
2346+ DBusPaths::serviceName(), DBusPaths::userData(1),
2347+ systemConnection());
2348
2349 QDBusObjectPath twitterDataPath(userDataInterface.createDataSet("twitter"));
2350 ASSERT_EQ(DBusPaths::dataSet(1), twitterDataPath.path());
2351@@ -334,4 +339,86 @@
2352 }
2353 }
2354
2355+TEST_F(TestSyncedUserMetricsStore, MergesSystemDataAtStartup) {
2356+ com::canonical::UserMetrics userMetricsInterface(DBusPaths::serviceName(),
2357+ DBusPaths::userMetrics(), systemConnection());
2358+
2359+ QDBusObjectPath twitterPath(
2360+ userMetricsInterface.createDataSource("twitter",
2361+ "twitter format string", "", "", MetricType::USER,
2362+ QVariantMap()));
2363+ ASSERT_EQ(DBusPaths::dataSource(1), twitterPath.path());
2364+
2365+ QDBusObjectPath batteryPath(
2366+ userMetricsInterface.createDataSource("battery",
2367+ "battery level format string", "", "", MetricType::SYSTEM,
2368+ QVariantMap()));
2369+ ASSERT_EQ(DBusPaths::dataSource(2), batteryPath.path());
2370+
2371+ QDBusObjectPath userDataPath(
2372+ userMetricsInterface.createUserData("username"));
2373+ ASSERT_EQ(DBusPaths::userData(1), userDataPath.path());
2374+
2375+ QDBusObjectPath systemDataPath(userMetricsInterface.createUserData(""));
2376+ ASSERT_EQ(DBusPaths::userData(2), systemDataPath.path());
2377+
2378+ com::canonical::usermetrics::UserData userDataInterface(
2379+ DBusPaths::serviceName(), DBusPaths::userData(1),
2380+ systemConnection());
2381+ QDBusObjectPath twitterDataPath(userDataInterface.createDataSet("twitter"));
2382+ ASSERT_EQ(DBusPaths::dataSet(1), twitterDataPath.path());
2383+
2384+ QVariantList twitterData( { 100.0, 50.0, "", -50.0, -100.0 });
2385+ QVariantList twitterExpected( { 1.0, 0.75, QVariant(), 0.25, 0.0 });
2386+
2387+ com::canonical::usermetrics::DataSet twitterDataSetInterface(
2388+ DBusPaths::serviceName(), DBusPaths::dataSet(1),
2389+ systemConnection());
2390+ twitterDataSetInterface.update(twitterData);
2391+
2392+ com::canonical::usermetrics::UserData systemDataInterface(
2393+ DBusPaths::serviceName(), DBusPaths::userData(2),
2394+ systemConnection());
2395+ QDBusObjectPath batteryDataPath(
2396+ systemDataInterface.createDataSet("battery"));
2397+ ASSERT_EQ(DBusPaths::dataSet(2), batteryDataPath.path());
2398+
2399+ QVariantList batteryData( { -100.0, -50.0, "", 50.0, 100.0 });
2400+ QVariantList batteryExpected( { 0.0, 0.25, QVariant(), 0.75, 1.0 });
2401+
2402+ com::canonical::usermetrics::DataSet batteryDataSetInterface(
2403+ DBusPaths::serviceName(), DBusPaths::dataSet(2),
2404+ systemConnection());
2405+ batteryDataSetInterface.update(batteryData);
2406+
2407+ SyncedUserMetricsStore store(systemConnection());
2408+ QSignalSpy connectionEstablishedSpy(&store,
2409+ SIGNAL(connectionEstablished()));
2410+ connectionEstablishedSpy.wait();
2411+
2412+ UserMetricsStore::const_iterator userDataIterator(
2413+ store.constFind("username"));
2414+ ASSERT_NE(userDataIterator, store.constEnd());
2415+ EXPECT_EQ(QString("username"), userDataIterator.key());
2416+ UserDataPtr userData(*userDataIterator);
2417+
2418+ UserData::const_iterator dataSetIterator(userData->constBegin());
2419+ ASSERT_NE(dataSetIterator, userData->constEnd());
2420+ // battery data set
2421+ {
2422+ DataSetPtr dataSet(*dataSetIterator);
2423+ EXPECT_EQ(batteryExpected, dataSet->data());
2424+ EXPECT_EQ(QDate::currentDate(), dataSet->lastUpdated());
2425+ }
2426+
2427+ ++dataSetIterator;
2428+ ASSERT_NE(dataSetIterator, userData->constEnd());
2429+ // twitter data set
2430+ {
2431+ DataSetPtr dataSet(*dataSetIterator);
2432+ EXPECT_EQ(twitterExpected, dataSet->data());
2433+ EXPECT_EQ(QDate::currentDate(), dataSet->lastUpdated());
2434+ }
2435+}
2436+
2437 } // namespace
2438
2439=== modified file 'tests/unit/libusermetricsoutput/TestUserMetricsImpl.cpp'
2440--- tests/unit/libusermetricsoutput/TestUserMetricsImpl.cpp 2013-08-08 14:44:26 +0000
2441+++ tests/unit/libusermetricsoutput/TestUserMetricsImpl.cpp 2013-09-04 17:46:16 +0000
2442@@ -17,6 +17,7 @@
2443 */
2444
2445 #include <QSignalSpy>
2446+#include <QDebug>
2447
2448 #include <libusermetricsoutput/ColorThemeProvider.h>
2449 #include <libusermetricsoutput/UserMetricsImpl.h>
2450@@ -194,7 +195,7 @@
2451
2452 UserMetricsStore::iterator userDataIterator(
2453 userDataStore->insert("soon-to-exist-user",
2454- UserDataPtr(new UserData())));
2455+ UserDataPtr(new UserData(*userDataStore))));
2456 UserDataPtr userData(*userDataIterator);
2457
2458 ColorThemePtr blankColorTheme(
2459@@ -204,7 +205,7 @@
2460 Return(emptyPair));
2461
2462 UserData::iterator dataSetIterator = userData->insert("data-source-id",
2463- DataSetPtr(new DataSet()));
2464+ DataSetPtr(new DataSet(dataSource)));
2465 DataSetPtr dataSet(*dataSetIterator);
2466
2467 QVariantList data;
2468@@ -232,7 +233,8 @@
2469 }
2470
2471 TEST_F(UserMetricsImplTest, HasEmptyDataForKnownUserWithNoData) {
2472- userDataStore->insert("existing-user", UserDataPtr(new UserData()));
2473+ userDataStore->insert("existing-user",
2474+ UserDataPtr(new UserData(*userDataStore)));
2475
2476 model->setUsername("existing-user");
2477 model->readyForDataChangeSlot();
2478@@ -284,11 +286,12 @@
2479 userDataStore->insert("data-source-id", dataSource);
2480
2481 UserMetricsStore::iterator userDataIterator(
2482- userDataStore->insert("username", UserDataPtr(new UserData())));
2483+ userDataStore->insert("username",
2484+ UserDataPtr(new UserData(*userDataStore))));
2485 UserDataPtr userData(*userDataIterator);
2486
2487 UserData::iterator dataSetIterator = userData->insert("data-source-id",
2488- DataSetPtr(new DataSet()));
2489+ DataSetPtr(new DataSet(dataSource)));
2490 DataSetPtr dataSet(*dataSetIterator);
2491
2492 // The data starts today
2493@@ -343,11 +346,12 @@
2494 userDataStore->insert("data-source-id", dataSource);
2495
2496 UserMetricsStore::iterator userDataIterator(
2497- userDataStore->insert("username", UserDataPtr(new UserData())));
2498+ userDataStore->insert("username",
2499+ UserDataPtr(new UserData(*userDataStore))));
2500 UserDataPtr userData(*userDataIterator);
2501
2502 UserData::iterator dataSetIterator = userData->insert("data-source-id",
2503- DataSetPtr(new DataSet()));
2504+ DataSetPtr(new DataSet(dataSource)));
2505 DataSetPtr dataSet(*dataSetIterator);
2506
2507 // The data starts today
2508@@ -415,11 +419,12 @@
2509 userDataStore->insert("data-source-id", dataSource);
2510
2511 UserMetricsStore::iterator userDataIterator(
2512- userDataStore->insert("username", UserDataPtr(new UserData())));
2513+ userDataStore->insert("username",
2514+ UserDataPtr(new UserData(*userDataStore))));
2515 UserDataPtr userData(*userDataIterator);
2516
2517 UserData::iterator dataSetIterator = userData->insert("data-source-id",
2518- DataSetPtr(new DataSet()));
2519+ DataSetPtr(new DataSet(dataSource)));
2520 DataSetPtr dataSet(*dataSetIterator);
2521
2522 // The data starts today
2523@@ -455,11 +460,12 @@
2524 userDataStore->insert("data-source-id", dataSource);
2525
2526 UserMetricsStore::iterator userDataIterator(
2527- userDataStore->insert("username", UserDataPtr(new UserData())));
2528+ userDataStore->insert("username",
2529+ UserDataPtr(new UserData(*userDataStore))));
2530 UserDataPtr userData(*userDataIterator);
2531
2532 UserData::iterator dataSetIterator = userData->insert("data-source-id",
2533- DataSetPtr(new DataSet()));
2534+ DataSetPtr(new DataSet(dataSource)));
2535 DataSetPtr dataSet(*dataSetIterator);
2536
2537 // The data starts today
2538@@ -503,11 +509,12 @@
2539 userDataStore->insert("data-source-id2", dataSource);
2540
2541 UserMetricsStore::iterator userDataIterator(
2542- userDataStore->insert("username", UserDataPtr(new UserData())));
2543+ userDataStore->insert("username",
2544+ UserDataPtr(new UserData(*userDataStore))));
2545 UserDataPtr userData(*userDataIterator);
2546
2547 UserData::iterator dataSetIterator = userData->insert("data-source-id2",
2548- DataSetPtr(new DataSet()));
2549+ DataSetPtr(new DataSet(dataSource)));
2550 DataSetPtr dataSet(*dataSetIterator);
2551
2552 // The data starts 3 days ago
2553@@ -571,11 +578,12 @@
2554 userDataStore->insert("data-source-id", dataSource);
2555
2556 UserMetricsStore::iterator userDataIterator(
2557- userDataStore->insert("username", UserDataPtr(new UserData())));
2558+ userDataStore->insert("username",
2559+ UserDataPtr(new UserData(*userDataStore))));
2560 UserDataPtr userData(*userDataIterator);
2561
2562 UserData::iterator dataSetIterator = userData->insert("data-source-id",
2563- DataSetPtr(new DataSet()));
2564+ DataSetPtr(new DataSet(dataSource)));
2565 DataSetPtr dataSet(*dataSetIterator);
2566
2567 // The data starts 3 days ago
2568@@ -634,11 +642,12 @@
2569 userDataStore->insert("data-source-id", dataSource);
2570
2571 UserMetricsStore::iterator userDataIterator(
2572- userDataStore->insert("username", UserDataPtr(new UserData())));
2573+ userDataStore->insert("username",
2574+ UserDataPtr(new UserData(*userDataStore))));
2575 UserDataPtr userData(*userDataIterator);
2576
2577 UserData::iterator dataSetIterator = userData->insert("data-source-id",
2578- DataSetPtr(new DataSet()));
2579+ DataSetPtr(new DataSet(dataSource)));
2580 DataSetPtr dataSet(*dataSetIterator);
2581
2582 // The data starts 2 days ago
2583@@ -686,7 +695,8 @@
2584 // the fake date provider says the date is 2001/01/07
2585
2586 UserMetricsStore::iterator userDataIterator(
2587- userDataStore->insert("username", UserDataPtr(new UserData())));
2588+ userDataStore->insert("username",
2589+ UserDataPtr(new UserData(*userDataStore))));
2590 UserDataPtr userData(*userDataIterator);
2591
2592 // first data set
2593@@ -699,7 +709,7 @@
2594 QVariantList data;
2595 data << 100.0 << 95.0 << 0.0 << 0.0 << 0.0 << 0.0 << 90.0 << 85.0;
2596 UserData::iterator dataSetIterator = userData->insert("data-source-one",
2597- DataSetPtr(new DataSet()));
2598+ DataSetPtr(new DataSet(dataSource)));
2599 DataSetPtr dataSet(*dataSetIterator);
2600 dataSet->setLastUpdated(QDate(2001, 1, 4));
2601 dataSet->setData(data);
2602@@ -716,7 +726,7 @@
2603 data << 50.0 << 65.0 << 0.0 << 0.0 << 0.0 << 0.0 << 0.0 << 0.0 << 0.0
2604 << 75.0 << 100.0;
2605 UserData::iterator dataSetIterator = userData->insert("data-source-two",
2606- DataSetPtr(new DataSet()));
2607+ DataSetPtr(new DataSet(dataSource)));
2608 DataSetPtr dataSet(*dataSetIterator);
2609 dataSet->setLastUpdated(QDate(2001, 1, 7));
2610 dataSet->setData(data);
2611@@ -804,7 +814,7 @@
2612 {
2613 UserMetricsStore::iterator userDataIterator(
2614 userDataStore->insert("first-user",
2615- UserDataPtr(new UserData())));
2616+ UserDataPtr(new UserData(*userDataStore))));
2617 UserDataPtr userData(*userDataIterator);
2618
2619 // first data set
2620@@ -816,7 +826,7 @@
2621 QVariantList data;
2622 data << 100.0 << 95.0 << 0.0 << 0.0 << 0.0 << 0.0 << 90.0 << 85.0;
2623 UserData::iterator dataSetIterator = userData->insert(
2624- "data-source-one", DataSetPtr(new DataSet()));
2625+ "data-source-one", DataSetPtr(new DataSet(dataSource)));
2626 DataSetPtr dataSet(*dataSetIterator);
2627 dataSet->setLastUpdated(QDate(2001, 1, 7));
2628 dataSet->setData(data);
2629@@ -833,7 +843,7 @@
2630 data << 50.0 << 65.0 << 0.0 << 0.0 << 0.0 << 0.0 << 0.0 << 0.0
2631 << 0.0 << 75.0 << 100.0;
2632 UserData::iterator dataSetIterator = userData->insert(
2633- "data-source-two", DataSetPtr(new DataSet()));
2634+ "data-source-two", DataSetPtr(new DataSet(dataSource)));
2635 DataSetPtr dataSet(*dataSetIterator);
2636 dataSet->setLastUpdated(QDate(2001, 1, 7));
2637 dataSet->setData(data);
2638@@ -844,7 +854,7 @@
2639 {
2640 UserMetricsStore::iterator userDataIterator(
2641 userDataStore->insert("second-user",
2642- UserDataPtr(new UserData())));
2643+ UserDataPtr(new UserData(*userDataStore))));
2644 UserDataPtr userData(*userDataIterator);
2645 DataSourcePtr foo;
2646
2647@@ -858,7 +868,7 @@
2648 data << 15.0 << 100.0 << 0.0 << 0.0 << 0.0 << 0.0 << 0.0 << 0.0
2649 << 0.0 << 5.0 << 10.0;
2650 UserData::iterator dataSetIterator = userData->insert(
2651- "data-source-three", DataSetPtr(new DataSet()));
2652+ "data-source-three", DataSetPtr(new DataSet(dataSource)));
2653 DataSetPtr dataSet(*dataSetIterator);
2654 dataSet->setLastUpdated(QDate(2001, 1, 7));
2655 dataSet->setData(data);
2656@@ -875,7 +885,7 @@
2657 data << 25.0 << 30.0 << 0.0 << 0.0 << 0.0 << 0.0 << 0.0 << 0.0
2658 << 0.0 << 0.0 << 0.0 << 0.0 << 0.0 << 100.0 << 35.0;
2659 UserData::iterator dataSetIterator = userData->insert(
2660- "data-source-xfour", DataSetPtr(new DataSet()));
2661+ "data-source-xfour", DataSetPtr(new DataSet(dataSource)));
2662 DataSetPtr dataSet(*dataSetIterator);
2663 dataSet->setLastUpdated(QDate(2001, 1, 7));
2664 dataSet->setData(data);
2665@@ -1087,11 +1097,12 @@
2666 userDataStore->insert("data", dataSource);
2667
2668 UserMetricsStore::iterator userDataIterator(
2669- userDataStore->insert("username", UserDataPtr(new UserData())));
2670+ userDataStore->insert("username",
2671+ UserDataPtr(new UserData(*userDataStore))));
2672 UserDataPtr userData(*userDataIterator);
2673
2674 UserData::iterator dataSetIterator = userData->insert("data",
2675- DataSetPtr(new DataSet()));
2676+ DataSetPtr(new DataSet(dataSource)));
2677 DataSetPtr dataSet(*dataSetIterator);
2678
2679 dataSet->setLastUpdated(QDate(2001, 03, 07));
2680@@ -1132,4 +1143,106 @@
2681 }
2682 }
2683
2684+TEST_F(UserMetricsImplTest, AddSourceWithMinimum) {
2685+ QVariantList data;
2686+ data << 100.0 << 95.0 << -100.0;
2687+
2688+ DataSourcePtr dataSource(new DataSource());
2689+ dataSource->setFormatString("test format string %1");
2690+ QVariantMap options;
2691+ options["minimum"] = 0.0;
2692+ dataSource->setOptions(options);
2693+ userDataStore->insert("data-source-id", dataSource);
2694+
2695+ UserMetricsStore::iterator userDataIterator(
2696+ userDataStore->insert("username",
2697+ UserDataPtr(new UserData(*userDataStore))));
2698+ UserDataPtr userData(*userDataIterator);
2699+
2700+ UserData::iterator dataSetIterator = userData->insert("data-source-id",
2701+ DataSetPtr(new DataSet(dataSource)));
2702+ DataSetPtr dataSet(*dataSetIterator);
2703+
2704+ // The data starts today
2705+ dataSet->setLastUpdated(QDate(2001, 01, 07));
2706+ dataSet->setData(data);
2707+
2708+ QSharedPointer<ColorTheme> blankColorTheme(
2709+ new ColorThemeImpl(QColor(), QColor(), QColor()));
2710+ ColorThemePtrPair emptyPair(blankColorTheme, blankColorTheme);
2711+ EXPECT_CALL(*colorThemeProvider, getColorTheme(QString("data-source-id"))).WillRepeatedly(
2712+ Return(emptyPair));
2713+
2714+ model->setUsername("username");
2715+ model->readyForDataChangeSlot();
2716+
2717+ EXPECT_EQ(QString("test format string 100"), model->label());
2718+
2719+ // assertions about first month's data
2720+ {
2721+ const QAbstractItemModel* month(model->firstMonth());
2722+ EXPECT_EQ(31, month->rowCount());
2723+ for (int i(0); i < 4; ++i) {
2724+ EXPECT_EQ(QVariant(), month->data(month->index(i, 0)));
2725+ }
2726+ EXPECT_EQ(QVariant(0.0), month->data(month->index(4, 0)));
2727+ EXPECT_EQ(QVariant(0.95), month->data(month->index(5, 0)));
2728+ EXPECT_EQ(QVariant(1.0), month->data(month->index(6, 0)));
2729+ for (int i(7); i < 31; ++i) {
2730+ EXPECT_EQ(QVariant(), month->data(month->index(i, 0)));
2731+ }
2732+ }
2733+}
2734+
2735+TEST_F(UserMetricsImplTest, AddSourceWithMaximum) {
2736+ QVariantList data;
2737+ data << 0.0 << 5.0 << 200.0;
2738+
2739+ DataSourcePtr dataSource(new DataSource());
2740+ dataSource->setFormatString("test format string %1");
2741+ QVariantMap options;
2742+ options["maximum"] = 100.0;
2743+ dataSource->setOptions(options);
2744+ userDataStore->insert("data-source-id", dataSource);
2745+
2746+ UserMetricsStore::iterator userDataIterator(
2747+ userDataStore->insert("username",
2748+ UserDataPtr(new UserData(*userDataStore))));
2749+ UserDataPtr userData(*userDataIterator);
2750+
2751+ UserData::iterator dataSetIterator = userData->insert("data-source-id",
2752+ DataSetPtr(new DataSet(dataSource)));
2753+ DataSetPtr dataSet(*dataSetIterator);
2754+
2755+ // The data starts today
2756+ dataSet->setLastUpdated(QDate(2001, 01, 07));
2757+ dataSet->setData(data);
2758+
2759+ QSharedPointer<ColorTheme> blankColorTheme(
2760+ new ColorThemeImpl(QColor(), QColor(), QColor()));
2761+ ColorThemePtrPair emptyPair(blankColorTheme, blankColorTheme);
2762+ EXPECT_CALL(*colorThemeProvider, getColorTheme(QString("data-source-id"))).WillRepeatedly(
2763+ Return(emptyPair));
2764+
2765+ model->setUsername("username");
2766+ model->readyForDataChangeSlot();
2767+
2768+ EXPECT_EQ(QString("test format string 0"), model->label());
2769+
2770+ // assertions about first month's data
2771+ {
2772+ const QAbstractItemModel* month(model->firstMonth());
2773+ EXPECT_EQ(31, month->rowCount());
2774+ for (int i(0); i < 4; ++i) {
2775+ EXPECT_EQ(QVariant(), month->data(month->index(i, 0)));
2776+ }
2777+ EXPECT_EQ(QVariant(1.0), month->data(month->index(4, 0)));
2778+ EXPECT_EQ(QVariant(0.05), month->data(month->index(5, 0)));
2779+ EXPECT_EQ(QVariant(0.0), month->data(month->index(6, 0)));
2780+ for (int i(7); i < 31; ++i) {
2781+ EXPECT_EQ(QVariant(), month->data(month->index(i, 0)));
2782+ }
2783+ }
2784+}
2785+
2786 } // namespace
2787
2788=== modified file 'tests/unit/usermetricsservice/TestUserMetricsService.cpp'
2789--- tests/unit/usermetricsservice/TestUserMetricsService.cpp 2013-08-15 09:06:26 +0000
2790+++ tests/unit/usermetricsservice/TestUserMetricsService.cpp 2013-09-04 17:46:16 +0000
2791@@ -88,7 +88,8 @@
2792
2793 EXPECT_EQ(QString("/com/canonical/UserMetrics/DataSource/1"),
2794 userMetrics.createDataSource("facebook", "%1 messages received",
2795- "no facebook data", "facebook text domain").path());
2796+ "no facebook data", "facebook text domain", 0,
2797+ QVariantMap()).path());
2798
2799 DBusDataSourcePtr facebook(userMetrics.dataSource("facebook"));
2800 EXPECT_EQ(QString("facebook"), facebook->name());
2801@@ -120,7 +121,8 @@
2802 {
2803 DBusUserMetrics userMetrics(systemConnection(), dateFactory);
2804
2805- userMetrics.createDataSource("twitter", "%1 tweets received", "", "");
2806+ userMetrics.createDataSource("twitter", "%1 tweets received", "", "", 0,
2807+ QVariantMap());
2808
2809 DBusDataSourcePtr twitter(userMetrics.dataSource("twitter"));
2810 EXPECT_EQ(QString("%1 tweets received"), twitter->formatString());
2811@@ -142,7 +144,7 @@
2812 DBusUserMetrics userMetrics(systemConnection(), dateFactory);
2813
2814 userMetrics.createDataSource("twitter", "%1 tweets received",
2815- "no tweets today", "");
2816+ "no tweets today", "", 0, QVariantMap());
2817
2818 DBusDataSourcePtr twitter(userMetrics.dataSource("twitter"));
2819 EXPECT_EQ(QString("no tweets today"), twitter->emptyDataString());
2820@@ -164,7 +166,7 @@
2821 DBusUserMetrics userMetrics(systemConnection(), dateFactory);
2822
2823 userMetrics.createDataSource("twitter", "%1 tweets received", "",
2824- "start text domain");
2825+ "start text domain", 0, QVariantMap());
2826
2827 DBusDataSourcePtr twitter(userMetrics.dataSource("twitter"));
2828 EXPECT_EQ(QString("start text domain"), twitter->textDomain());
2829@@ -185,13 +187,15 @@
2830 {
2831 DBusUserMetrics userMetrics(systemConnection(), dateFactory);
2832
2833- userMetrics.createDataSource("twitter", "%1 tweets received", "", "");
2834+ userMetrics.createDataSource("twitter", "%1 tweets received", "", "", 0,
2835+ QVariantMap());
2836
2837 DBusDataSourcePtr twitter(userMetrics.dataSource("twitter"));
2838 EXPECT_EQ(QString("twitter"), twitter->name());
2839 EXPECT_EQ(QString("%1 tweets received"), twitter->formatString());
2840
2841- userMetrics.createDataSource("twitter", "%1 new format string", "", "");
2842+ userMetrics.createDataSource("twitter", "%1 new format string", "", "",
2843+ 0, QVariantMap());
2844
2845 EXPECT_EQ(QString("twitter"), twitter->name());
2846 EXPECT_EQ(QString("%1 new format string"), twitter->formatString());
2847@@ -242,7 +246,8 @@
2848 {
2849 DBusUserMetrics userMetrics(systemConnection(), dateFactory);
2850
2851- userMetrics.createDataSource("twitter", "%1 tweets received", "", "");
2852+ userMetrics.createDataSource("twitter", "%1 tweets received", "", "", 0,
2853+ QVariantMap());
2854 userMetrics.createUserData("alice");
2855
2856 DBusUserDataPtr alice(userMetrics.userData("alice"));
2857@@ -298,7 +303,7 @@
2858 Return(QDate(2001, 01, 5))).WillOnce(Return(QDate(2001, 01, 8)));
2859
2860 DBusUserMetrics userMetrics(systemConnection(), dateFactory);
2861- userMetrics.createDataSource("twitter", "foo", "", "");
2862+ userMetrics.createDataSource("twitter", "foo", "", "", 0, QVariantMap());
2863
2864 userMetrics.createUserData("bob");
2865 DBusUserDataPtr bob(userMetrics.userData("bob"));
2866@@ -327,7 +332,7 @@
2867 Return(QDate(2001, 01, 5))).WillOnce(Return(QDate(2001, 01, 15)));
2868
2869 DBusUserMetrics userMetrics(systemConnection(), dateFactory);
2870- userMetrics.createDataSource("twitter", "foo", "", "");
2871+ userMetrics.createDataSource("twitter", "foo", "", "", 0, QVariantMap());
2872
2873 userMetrics.createUserData("bob");
2874 DBusUserDataPtr bob(userMetrics.userData("bob"));
2875@@ -361,7 +366,7 @@
2876 Return(QDate(2001, 01, 5))).WillOnce(Return(QDate(2001, 01, 7)));
2877
2878 DBusUserMetrics userMetrics(systemConnection(), dateFactory);
2879- userMetrics.createDataSource("twitter", "foo", "", "");
2880+ userMetrics.createDataSource("twitter", "foo", "", "", 0, QVariantMap());
2881
2882 userMetrics.createUserData("bob");
2883 DBusUserDataPtr bob(userMetrics.userData("bob"));
2884@@ -387,7 +392,7 @@
2885
2886 TEST_F(TestUserMetricsService, MultipleUsers) {
2887 DBusUserMetrics userMetrics(systemConnection(), dateFactory);
2888- userMetrics.createDataSource("twitter", "foo", "", "");
2889+ userMetrics.createDataSource("twitter", "foo", "", "", 0, QVariantMap());
2890
2891 userMetrics.createUserData("alice");
2892 DBusUserDataPtr alice(userMetrics.userData("alice"));
2893@@ -415,7 +420,7 @@
2894 Return(QDate(2001, 03, 1)));
2895
2896 DBusUserMetrics userMetrics(systemConnection(), dateFactory);
2897- userMetrics.createDataSource("twitter", "foo", "", "");
2898+ userMetrics.createDataSource("twitter", "foo", "", "", 0, QVariantMap());
2899
2900 userMetrics.createUserData("bob");
2901 DBusUserDataPtr bob(userMetrics.userData("bob"));
2902@@ -451,7 +456,7 @@
2903 Return(QDate(2001, 3, 5)));
2904
2905 DBusUserMetrics userMetrics(systemConnection(), dateFactory);
2906- userMetrics.createDataSource("twitter", "foo", "", "");
2907+ userMetrics.createDataSource("twitter", "foo", "", "", 0, QVariantMap());
2908
2909 userMetrics.createUserData("bob");
2910 DBusUserDataPtr bob(userMetrics.userData("bob"));

Subscribers

People subscribed via source and target branches

to all changes: