Changeset View
Changeset View
Standalone View
Standalone View
tests/testlib/akonadifakedata.cpp
Show All 35 Lines | |||||
36 | template<class Entity> | 36 | template<class Entity> | ||
37 | static Akonadi::Collection::Id findParentId(const Entity &entity) | 37 | static Akonadi::Collection::Id findParentId(const Entity &entity) | ||
38 | { | 38 | { | ||
39 | const auto parent = entity.parentCollection(); | 39 | const auto parent = entity.parentCollection(); | ||
40 | return parent.isValid() ? parent.id() | 40 | return parent.isValid() ? parent.id() | ||
41 | : Akonadi::Collection::root().id(); | 41 | : Akonadi::Collection::root().id(); | ||
42 | } | 42 | } | ||
43 | 43 | | |||
44 | static const char s_contextListProperty[] = "ContextList"; | ||||
45 | static const char s_appName[] = "Zanshin"; | ||||
46 | | ||||
47 | // Should be in the serializer ideally ... but we don't link to that from here anyway. | ||||
48 | static QStringList extractContextUids(const Akonadi::Item &taskItem) | ||||
49 | { | ||||
50 | if (!taskItem.hasPayload<KCalCore::Todo::Ptr>()) | ||||
51 | return {}; | ||||
52 | auto todo = taskItem.payload<KCalCore::Todo::Ptr>(); | ||||
53 | const QString contexts = todo->customProperty(s_appName, s_contextListProperty); | ||||
54 | return contexts.split(',', QString::SkipEmptyParts); | ||||
55 | } | ||||
56 | | ||||
57 | // Duplicated from the serializer | ||||
58 | static QString contextUid(const Akonadi::Item &contextItem) | ||||
59 | { | ||||
60 | auto contextTodo = contextItem.payload<KCalCore::Todo::Ptr>(); | ||||
61 | return contextTodo->uid(); | ||||
62 | } | ||||
63 | | ||||
64 | // Somewhat duplicated from the serializer | ||||
65 | static void removeContextFromTask(const QString &contextUid, Akonadi::Item &item) | ||||
66 | { | ||||
67 | auto todo = item.payload<KCalCore::Todo::Ptr>(); | ||||
68 | const QString contexts = todo->customProperty(s_appName, s_contextListProperty); | ||||
69 | QStringList contextList = contexts.split(',', QString::SkipEmptyParts); | ||||
70 | contextList.removeAll(contextUid); | ||||
71 | if (contextList.isEmpty()) | ||||
72 | todo->removeCustomProperty(s_appName, s_contextListProperty); | ||||
73 | else | ||||
74 | todo->setCustomProperty(s_appName, s_contextListProperty, contextList.join(',')); | ||||
75 | item.setPayload<KCalCore::Todo::Ptr>(todo); | ||||
76 | Q_ASSERT(contextList == extractContextUids(item)); | ||||
77 | } | ||||
78 | | ||||
79 | // Duplicate from the serializer | ||||
80 | static bool isContext(const Akonadi::Item &item) | ||||
81 | { | ||||
82 | if (!item.hasPayload<KCalCore::Todo::Ptr>()) | ||||
83 | return false; | ||||
84 | | ||||
85 | auto todo = item.payload<KCalCore::Todo::Ptr>(); | ||||
86 | return !todo->customProperty(s_appName, "Context").isEmpty(); | ||||
87 | } | ||||
88 | | ||||
44 | AkonadiFakeData::AkonadiFakeData() | 89 | AkonadiFakeData::AkonadiFakeData() | ||
45 | : m_monitor(new AkonadiFakeMonitor) | 90 | : m_monitor(new AkonadiFakeMonitor) | ||
46 | { | 91 | { | ||
47 | } | 92 | } | ||
48 | 93 | | |||
49 | AkonadiFakeData::AkonadiFakeData(const AkonadiFakeData &other) | 94 | AkonadiFakeData::AkonadiFakeData(const AkonadiFakeData &other) | ||
50 | : m_collections(other.m_collections), | 95 | : m_collections(other.m_collections), | ||
51 | m_childCollections(other.m_childCollections), | 96 | m_childCollections(other.m_childCollections), | ||
▲ Show 20 Lines • Show All 113 Lines • ▼ Show 20 Line(s) | 196 | { | |||
165 | 210 | | |||
166 | const auto parentId = findParentId(m_collections[collection.id()]); | 211 | const auto parentId = findParentId(m_collections[collection.id()]); | ||
167 | const auto col = m_collections.take(collection.id()); | 212 | const auto col = m_collections.take(collection.id()); | ||
168 | m_childCollections[parentId].removeAll(collection.id()); | 213 | m_childCollections[parentId].removeAll(collection.id()); | ||
169 | 214 | | |||
170 | m_monitor->removeCollection(col); | 215 | m_monitor->removeCollection(col); | ||
171 | } | 216 | } | ||
172 | 217 | | |||
173 | Akonadi::Tag::List AkonadiFakeData::tags() const | 218 | QStringList AkonadiFakeData::contextsUids() const | ||
174 | { | 219 | { | ||
175 | return m_tags.values().toVector(); | 220 | return m_contexts.keys(); | ||
176 | } | 221 | } | ||
177 | 222 | | |||
178 | Akonadi::Tag AkonadiFakeData::tag(Akonadi::Tag::Id id) const | 223 | Akonadi::Item::List AkonadiFakeData::contexts() const | ||
179 | { | 224 | { | ||
180 | if (!m_tags.contains(id)) | 225 | return m_contexts.values().toVector(); | ||
181 | return Akonadi::Tag(); | 226 | } | ||
182 | 227 | | |||
183 | return m_tags.value(id); | 228 | Akonadi::Item AkonadiFakeData::contextItem(const QString &uid) const | ||
229 | { | ||||
230 | return m_contexts.value(uid); | ||||
184 | } | 231 | } | ||
185 | 232 | | |||
186 | void AkonadiFakeData::createTag(const Akonadi::Tag &tag) | 233 | void AkonadiFakeData::createContext(const Akonadi::Item &contextItem) | ||
187 | { | 234 | { | ||
188 | Q_ASSERT(!m_tags.contains(tag.id())); | 235 | const QString uid = contextUid(contextItem); | ||
189 | m_tags[tag.id()] = tag; | 236 | Q_ASSERT(!m_contexts.contains(uid)); | ||
190 | m_monitor->addTag(tag); | 237 | m_contexts[uid] = contextItem; | ||
238 | m_monitor->addItem(contextItem); | ||||
191 | } | 239 | } | ||
192 | 240 | | |||
193 | void AkonadiFakeData::modifyTag(const Akonadi::Tag &tag) | 241 | void AkonadiFakeData::modifyContext(const Akonadi::Item &contextItem) | ||
194 | { | 242 | { | ||
195 | Q_ASSERT(m_tags.contains(tag.id())); | 243 | const QString uid = contextUid(contextItem); | ||
196 | const auto oldTag = m_tags.take(tag.id()); | 244 | Q_ASSERT(m_contexts.contains(uid)); | ||
197 | auto newTag = tag; | 245 | const auto oldContextItem = m_contexts.take(uid); | ||
198 | newTag.setGid(oldTag.gid()); | 246 | auto newItem = contextItem; | ||
199 | newTag.setRemoteId(oldTag.remoteId()); | 247 | newItem.setGid(oldContextItem.gid()); | ||
200 | m_tags[tag.id()] = newTag; | 248 | newItem.setRemoteId(oldContextItem.remoteId()); | ||
201 | m_monitor->changeTag(newTag); | 249 | m_contexts[uid] = newItem; | ||
250 | m_monitor->changeItem(newItem); | ||||
202 | } | 251 | } | ||
203 | 252 | | |||
204 | void AkonadiFakeData::removeTag(const Akonadi::Tag &tag) | 253 | void AkonadiFakeData::removeContext(const Akonadi::Item &contextItem) | ||
205 | { | 254 | { | ||
206 | Q_ASSERT(m_tags.contains(tag.id())); | 255 | const QString uid = contextUid(contextItem); | ||
256 | Q_ASSERT(m_contexts.contains(uid)); | ||||
207 | 257 | | |||
208 | const auto ids = m_tagItems[tag.id()]; | 258 | const auto ids = m_contextItems[uid]; | ||
209 | foreach (const auto &id, ids) { | 259 | foreach (const auto &id, ids) { | ||
210 | Q_ASSERT(m_items.contains(id)); | 260 | Q_ASSERT(m_items.contains(id)); | ||
211 | auto item = m_items.value(id); | 261 | auto item = m_items.value(id); | ||
212 | item.clearTag(tag); | 262 | removeContextFromTask(uid, item); | ||
213 | m_items[id] = item; | 263 | m_items[id] = item; | ||
214 | m_monitor->changeItem(item); | 264 | m_monitor->changeItem(item); | ||
215 | } | 265 | } | ||
216 | m_tagItems.remove(tag.id()); | 266 | m_contextItems.remove(uid); | ||
217 | 267 | | |||
218 | m_tags.remove(tag.id()); | 268 | m_contexts.remove(uid); | ||
219 | m_monitor->removeTag(tag); | 269 | m_monitor->removeItem(contextItem); | ||
220 | } | 270 | } | ||
221 | 271 | | |||
222 | Akonadi::Item::List AkonadiFakeData::items() const | 272 | Akonadi::Item::List AkonadiFakeData::items() const | ||
223 | { | 273 | { | ||
224 | return m_items.values().toVector(); | 274 | return m_items.values().toVector(); | ||
225 | } | 275 | } | ||
226 | 276 | | |||
227 | Akonadi::Item::List AkonadiFakeData::childItems(Akonadi::Collection::Id parentId) const | 277 | Akonadi::Item::List AkonadiFakeData::childItems(Akonadi::Collection::Id parentId) const | ||
228 | { | 278 | { | ||
229 | if (!m_childItems.contains(parentId)) | 279 | if (!m_childItems.contains(parentId)) | ||
230 | return {}; | 280 | return {}; | ||
231 | 281 | | |||
232 | const auto ids = m_childItems.value(parentId); | 282 | const auto ids = m_childItems.value(parentId); | ||
233 | auto result = Akonadi::Item::List(); | 283 | auto result = Akonadi::Item::List(); | ||
234 | std::transform(std::begin(ids), std::end(ids), | 284 | std::transform(std::begin(ids), std::end(ids), | ||
235 | std::back_inserter(result), | 285 | std::back_inserter(result), | ||
236 | [this] (Akonadi::Item::Id id) { | 286 | [this] (Akonadi::Item::Id id) { | ||
237 | Q_ASSERT(m_items.contains(id)); | 287 | Q_ASSERT(m_items.contains(id)); | ||
238 | return m_items.value(id); | 288 | return m_items.value(id); | ||
239 | }); | 289 | }); | ||
240 | return result; | 290 | return result; | ||
241 | } | 291 | } | ||
242 | 292 | | |||
243 | Akonadi::Item::List AkonadiFakeData::tagItems(Akonadi::Tag::Id tagId) const | 293 | Akonadi::Item::List AkonadiFakeData::contextItems(const QString &contextUid) const | ||
244 | { | 294 | { | ||
245 | if (!m_tagItems.contains(tagId)) | 295 | const auto ids = m_contextItems.value(contextUid); | ||
246 | return {}; | | |||
247 | | ||||
248 | const auto ids = m_tagItems.value(tagId); | | |||
249 | auto result = Akonadi::Item::List(); | 296 | auto result = Akonadi::Item::List(); | ||
297 | result.reserve(ids.size()); | ||||
250 | std::transform(std::begin(ids), std::end(ids), | 298 | std::transform(std::begin(ids), std::end(ids), | ||
251 | std::back_inserter(result), | 299 | std::back_inserter(result), | ||
252 | [this] (Akonadi::Item::Id id) { | 300 | [this] (Akonadi::Item::Id id) { | ||
253 | Q_ASSERT(m_items.contains(id)); | 301 | Q_ASSERT(m_items.contains(id)); | ||
254 | return m_items.value(id); | 302 | return m_items.value(id); | ||
255 | }); | 303 | }); | ||
256 | return result; | 304 | return result; | ||
257 | } | 305 | } | ||
258 | 306 | | |||
259 | Akonadi::Item AkonadiFakeData::item(Akonadi::Item::Id id) const | 307 | Akonadi::Item AkonadiFakeData::item(Akonadi::Item::Id id) const | ||
260 | { | 308 | { | ||
261 | if (!m_items.contains(id)) | 309 | if (!m_items.contains(id)) | ||
262 | return {}; | 310 | return {}; | ||
263 | 311 | | |||
264 | return m_items.value(id); | 312 | return m_items.value(id); | ||
265 | } | 313 | } | ||
266 | 314 | | |||
267 | void AkonadiFakeData::createItem(const Akonadi::Item &item) | 315 | void AkonadiFakeData::createItem(const Akonadi::Item &item) | ||
268 | { | 316 | { | ||
317 | Q_ASSERT(item.isValid()); | ||||
269 | Q_ASSERT(!m_items.contains(item.id())); | 318 | Q_ASSERT(!m_items.contains(item.id())); | ||
270 | m_items[item.id()] = item; | 319 | m_items[item.id()] = item; | ||
271 | 320 | | |||
272 | const auto parentId = findParentId(item); | 321 | const auto parentId = findParentId(item); | ||
273 | m_childItems[parentId] << item.id(); | 322 | m_childItems[parentId] << item.id(); | ||
274 | 323 | | |||
275 | foreach (const auto &tag, item.tags()) { | 324 | const QStringList contextUids = extractContextUids(item); | ||
276 | Q_ASSERT(m_tags.contains(tag.id())); | 325 | foreach (const auto &contextUid, contextUids) { | ||
277 | m_tagItems[tag.id()] << item.id(); | 326 | Q_ASSERT(m_contexts.contains(contextUid)); | ||
327 | m_contextItems[contextUid] << item.id(); | ||||
278 | } | 328 | } | ||
279 | 329 | | |||
330 | if (isContext(item)) { | ||||
331 | createContext(item); | ||||
332 | } else { | ||||
280 | m_monitor->addItem(reconstructItemDependencies(item)); | 333 | m_monitor->addItem(reconstructItemDependencies(item)); | ||
281 | } | 334 | } | ||
335 | } | ||||
282 | 336 | | |||
283 | void AkonadiFakeData::modifyItem(const Akonadi::Item &item) | 337 | void AkonadiFakeData::modifyItem(const Akonadi::Item &item) | ||
284 | { | 338 | { | ||
285 | Q_ASSERT(m_items.contains(item.id())); | 339 | Q_ASSERT(m_items.contains(item.id())); | ||
340 | Q_ASSERT(item.isValid()); | ||||
286 | 341 | | |||
287 | const auto oldTags = m_items[item.id()].tags(); | 342 | const auto oldContexts = extractContextUids(m_items[item.id()]); | ||
343 | const auto newContexts = extractContextUids(item); | ||||
288 | const auto oldParentId = findParentId(m_items[item.id()]); | 344 | const auto oldParentId = findParentId(m_items[item.id()]); | ||
289 | const auto oldItem = m_items.take(item.id()); | 345 | const auto oldItem = m_items.take(item.id()); | ||
290 | auto newItem = item; | 346 | auto newItem = item; | ||
291 | newItem.setRemoteId(oldItem.remoteId()); | 347 | newItem.setRemoteId(oldItem.remoteId()); | ||
292 | if (!newItem.parentCollection().isValid()) | 348 | if (!newItem.parentCollection().isValid()) | ||
293 | newItem.setParentCollection(oldItem.parentCollection()); | 349 | newItem.setParentCollection(oldItem.parentCollection()); | ||
294 | 350 | | |||
295 | m_items[newItem.id()] = newItem; | 351 | m_items[newItem.id()] = newItem; | ||
296 | const auto parentId = findParentId(newItem); | 352 | const auto parentId = findParentId(newItem); | ||
297 | 353 | | |||
298 | if (oldParentId != parentId) { | 354 | if (oldParentId != parentId) { | ||
299 | m_childItems[oldParentId].removeAll(newItem.id()); | 355 | m_childItems[oldParentId].removeAll(newItem.id()); | ||
300 | m_childItems[parentId] << newItem.id(); | 356 | m_childItems[parentId] << newItem.id(); | ||
301 | m_monitor->moveItem(reconstructItemDependencies(newItem)); | 357 | m_monitor->moveItem(reconstructItemDependencies(newItem)); | ||
302 | } | 358 | } | ||
303 | 359 | | |||
304 | foreach (const auto &tag, oldTags) { | 360 | foreach (const auto &contextUid, oldContexts) { | ||
305 | m_tagItems[tag.id()].removeAll(newItem.id()); | 361 | m_contextItems[contextUid].removeAll(newItem.id()); | ||
306 | } | 362 | } | ||
307 | 363 | | |||
308 | foreach (const auto &tag, newItem.tags()) { | 364 | foreach (const auto &contextUid, newContexts) { | ||
309 | Q_ASSERT(m_tags.contains(tag.id())); | 365 | Q_ASSERT(m_contexts.contains(contextUid)); | ||
310 | m_tagItems[tag.id()] << newItem.id(); | 366 | m_contextItems[contextUid] << newItem.id(); | ||
311 | } | 367 | } | ||
312 | 368 | | |||
369 | if (isContext(item)) { | ||||
370 | modifyContext(item); | ||||
371 | } else { | ||||
313 | m_monitor->changeItem(reconstructItemDependencies(newItem)); | 372 | m_monitor->changeItem(reconstructItemDependencies(newItem)); | ||
314 | } | 373 | } | ||
374 | } | ||||
315 | 375 | | |||
316 | void AkonadiFakeData::removeItem(const Akonadi::Item &item) | 376 | void AkonadiFakeData::removeItem(const Akonadi::Item &item) | ||
317 | { | 377 | { | ||
378 | Q_ASSERT(item.isValid()); | ||||
318 | Q_ASSERT(m_items.contains(item.id())); | 379 | Q_ASSERT(m_items.contains(item.id())); | ||
319 | const auto parentId = findParentId(m_items[item.id()]); | 380 | const auto parentId = findParentId(m_items[item.id()]); | ||
320 | const auto i = m_items.take(item.id()); | 381 | const auto i = m_items.take(item.id()); | ||
321 | m_childItems[parentId].removeAll(item.id()); | 382 | m_childItems[parentId].removeAll(item.id()); | ||
322 | 383 | | |||
323 | foreach (const Akonadi::Tag &tag, item.tags()) { | 384 | foreach (const auto &contextUid, extractContextUids(item)) { | ||
324 | m_tagItems[tag.id()].removeAll(item.id()); | 385 | m_contextItems[contextUid].removeAll(item.id()); | ||
325 | } | 386 | } | ||
326 | 387 | | |||
388 | if (isContext(item)) { | ||||
389 | removeContext(item); | ||||
390 | } else { | ||||
327 | m_monitor->removeItem(reconstructItemDependencies(i)); | 391 | m_monitor->removeItem(reconstructItemDependencies(i)); | ||
328 | } | 392 | } | ||
393 | } | ||||
329 | 394 | | |||
330 | Akonadi::MonitorInterface *AkonadiFakeData::createMonitor() | 395 | Akonadi::MonitorInterface *AkonadiFakeData::createMonitor() | ||
331 | { | 396 | { | ||
332 | auto monitor = new AkonadiFakeMonitor; | 397 | auto monitor = new AkonadiFakeMonitor; | ||
333 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::collectionAdded, | 398 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::collectionAdded, | ||
334 | monitor, &AkonadiFakeMonitor::addCollection); | 399 | monitor, &AkonadiFakeMonitor::addCollection); | ||
335 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::collectionChanged, | 400 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::collectionChanged, | ||
336 | monitor, &AkonadiFakeMonitor::changeCollection); | 401 | monitor, &AkonadiFakeMonitor::changeCollection); | ||
337 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::collectionSelectionChanged, | 402 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::collectionSelectionChanged, | ||
338 | monitor, &AkonadiFakeMonitor::changeCollectionSelection); | 403 | monitor, &AkonadiFakeMonitor::changeCollectionSelection); | ||
339 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::collectionRemoved, | 404 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::collectionRemoved, | ||
340 | monitor, &AkonadiFakeMonitor::removeCollection); | 405 | monitor, &AkonadiFakeMonitor::removeCollection); | ||
341 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::tagAdded, | | |||
342 | monitor, &AkonadiFakeMonitor::addTag); | | |||
343 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::tagChanged, | | |||
344 | monitor, &AkonadiFakeMonitor::changeTag); | | |||
345 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::tagRemoved, | | |||
346 | monitor, &AkonadiFakeMonitor::removeTag); | | |||
347 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::itemAdded, | 406 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::itemAdded, | ||
348 | monitor, &AkonadiFakeMonitor::addItem); | 407 | monitor, &AkonadiFakeMonitor::addItem); | ||
349 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::itemChanged, | 408 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::itemChanged, | ||
350 | monitor, &AkonadiFakeMonitor::changeItem); | 409 | monitor, &AkonadiFakeMonitor::changeItem); | ||
351 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::itemRemoved, | 410 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::itemRemoved, | ||
352 | monitor, &AkonadiFakeMonitor::removeItem); | 411 | monitor, &AkonadiFakeMonitor::removeItem); | ||
353 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::itemMoved, | 412 | QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::itemMoved, | ||
354 | monitor, &AkonadiFakeMonitor::moveItem); | 413 | monitor, &AkonadiFakeMonitor::moveItem); | ||
Show All 26 Lines | 439 | { | |||
381 | if (m_items.isEmpty()) | 440 | if (m_items.isEmpty()) | ||
382 | return 0; | 441 | return 0; | ||
383 | 442 | | |||
384 | auto it = std::max_element(m_items.constBegin(), m_items.constEnd(), | 443 | auto it = std::max_element(m_items.constBegin(), m_items.constEnd(), | ||
385 | idLessThan<Akonadi::Item>); | 444 | idLessThan<Akonadi::Item>); | ||
386 | return it.key(); | 445 | return it.key(); | ||
387 | } | 446 | } | ||
388 | 447 | | |||
389 | Akonadi::Tag::Id AkonadiFakeData::maxTagId() const | | |||
390 | { | | |||
391 | if (m_tags.isEmpty()) | | |||
392 | return 0; | | |||
393 | | ||||
394 | auto it = std::max_element(m_tags.constBegin(), m_tags.constEnd(), | | |||
395 | idLessThan<Akonadi::Tag>); | | |||
396 | return it.key(); | | |||
397 | } | | |||
398 | | ||||
399 | Akonadi::Collection AkonadiFakeData::reconstructAncestors(const Akonadi::Collection &collection, | 448 | Akonadi::Collection AkonadiFakeData::reconstructAncestors(const Akonadi::Collection &collection, | ||
400 | const Akonadi::Collection &root) const | 449 | const Akonadi::Collection &root) const | ||
401 | { | 450 | { | ||
402 | if (!collection.isValid()) | 451 | if (!collection.isValid()) | ||
403 | return Akonadi::Collection::root(); | 452 | return Akonadi::Collection::root(); | ||
404 | 453 | | |||
405 | if (collection == root) | 454 | if (collection == root) | ||
406 | return collection; | 455 | return collection; | ||
407 | 456 | | |||
408 | auto parent = collection.parentCollection(); | 457 | auto parent = collection.parentCollection(); | ||
409 | auto reconstructedParent = reconstructAncestors(m_collections.value(parent.id()), root); | 458 | auto reconstructedParent = reconstructAncestors(m_collections.value(parent.id()), root); | ||
410 | 459 | | |||
411 | auto result = collection; | 460 | auto result = collection; | ||
412 | result.setParentCollection(reconstructedParent); | 461 | result.setParentCollection(reconstructedParent); | ||
413 | return result; | 462 | return result; | ||
414 | } | 463 | } | ||
415 | 464 | | |||
416 | Akonadi::Item AkonadiFakeData::reconstructItemDependencies(const Akonadi::Item &item, const Akonadi::Collection &root) const | 465 | Akonadi::Item AkonadiFakeData::reconstructItemDependencies(const Akonadi::Item &item, const Akonadi::Collection &root) const | ||
417 | { | 466 | { | ||
418 | auto result = item; | 467 | auto result = item; | ||
419 | result.setParentCollection(reconstructAncestors(item.parentCollection(), root)); | 468 | result.setParentCollection(reconstructAncestors(item.parentCollection(), root)); | ||
420 | | ||||
421 | auto tags = item.tags(); | | |||
422 | std::transform(tags.constBegin(), tags.constEnd(), | | |||
423 | tags.begin(), | | |||
424 | [=] (const Akonadi::Tag &t) { | | |||
425 | return tag(t.id()); | | |||
426 | }); | | |||
427 | result.setTags(tags); | | |||
428 | | ||||
429 | return result; | 469 | return result; | ||
430 | } | 470 | } | ||
431 | 471 | | |||
432 | const AkonadiFakeStorageBehavior &AkonadiFakeData::storageBehavior() const | 472 | const AkonadiFakeStorageBehavior &AkonadiFakeData::storageBehavior() const | ||
433 | { | 473 | { | ||
434 | return m_storageBehavior; | 474 | return m_storageBehavior; | ||
435 | } | 475 | } | ||
436 | 476 | | |||
437 | AkonadiFakeStorageBehavior &AkonadiFakeData::storageBehavior() | 477 | AkonadiFakeStorageBehavior &AkonadiFakeData::storageBehavior() | ||
438 | { | 478 | { | ||
439 | return m_storageBehavior; | 479 | return m_storageBehavior; | ||
440 | } | 480 | } |