libquentier 0.8.0
The library for rich desktop clients of Evernote service
Loading...
Searching...
No Matches
ILocalStorage.h
1/*
2 * Copyright 2020-2023 Dmitry Ivanov
3 *
4 * This file is part of libquentier
5 *
6 * libquentier is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation, version 3 of the License.
9 *
10 * libquentier is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with libquentier. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#pragma once
20
21#include <quentier/local_storage/Fwd.h>
22#include <quentier/local_storage/NoteSearchQuery.h>
23#include <quentier/types/Fwd.h>
24#include <quentier/utility/Linkage.h>
25
26#include <qevercloud/types/LinkedNotebook.h>
27#include <qevercloud/types/Note.h>
28#include <qevercloud/types/Notebook.h>
29#include <qevercloud/types/Resource.h>
30#include <qevercloud/types/SavedSearch.h>
31#include <qevercloud/types/SharedNotebook.h>
32#include <qevercloud/types/Tag.h>
33#include <qevercloud/types/User.h>
34
35#include <QFlags>
36#include <QFuture>
37#include <QHash>
38#include <QList>
39#include <QStringList>
40#include <QThreadPool>
41
42#include <optional>
43#include <utility>
44
45class QDebug;
46class QTextStream;
47class QThreadPool;
48
49namespace quentier::local_storage {
50
52{
53public:
54 virtual ~ILocalStorage() = default;
55
56public:
57 enum class StartupOption
58 {
59 ClearDatabase = 1 << 1,
60 OverrideLock = 1 << 2
61 };
62 Q_DECLARE_FLAGS(StartupOptions, StartupOption);
63
65 QTextStream & strm, StartupOption option);
66
68 QDebug & dbg, StartupOption option);
69
72
75
77
78 enum class ListObjectsFilter
79 {
80 Include,
81 Exclude
82 };
83
85 QTextStream & strm, ListObjectsFilter filter);
86
88 QDebug & dbg, ListObjectsFilter filter);
89
91
93 {
94 std::optional<ListObjectsFilter> m_locallyModifiedFilter;
95 std::optional<ListObjectsFilter> m_withGuidFilter;
96 std::optional<ListObjectsFilter> m_localOnlyFilter;
97 std::optional<ListObjectsFilter> m_locallyFavoritedFilter;
98 };
99
102
105
107
109 {
110 std::optional<ListObjectsFilter> m_locallyModifiedFilter;
111 std::optional<ListObjectsFilter> m_locallyFavoritedFilter;
112 };
113
116
119
121
122 enum class OrderDirection
123 {
124 Ascending,
125 Descending
126 };
127
129 QTextStream & strm, OrderDirection orderDirection);
130
132 QDebug & dbg, OrderDirection orderDirection);
133
135
136 enum class ListNotebooksOrder
137 {
138 NoOrder,
139 ByUpdateSequenceNumber,
140 ByNotebookName,
141 ByCreationTimestamp,
142 ByModificationTimestamp
143 };
144
146 QTextStream & strm, ListNotebooksOrder order);
147
149 QDebug & dbg, ListNotebooksOrder order);
150
152
153 enum class ListLinkedNotebooksOrder
154 {
155 NoOrder,
156 ByUpdateSequenceNumber,
157 ByShareName,
158 ByUsername,
159 };
160
161 friend QUENTIER_EXPORT QTextStream & operator<<(
162 QTextStream & strm, ListLinkedNotebooksOrder order);
163
164 friend QUENTIER_EXPORT QDebug & operator<<(
165 QDebug & dbg, ListLinkedNotebooksOrder order);
166
168
169 enum class ListTagsOrder
170 {
171 NoOrder,
172 ByUpdateSequenceNumber,
173 ByName
174 };
175
176 friend QUENTIER_EXPORT QTextStream & operator<<(
177 QTextStream & strm, ListTagsOrder order);
178
179 friend QUENTIER_EXPORT QDebug & operator<<(
180 QDebug & dbg, ListTagsOrder order);
181
183
184 enum class ListNotesOrder
185 {
186 NoOrder,
187 ByUpdateSequenceNumber,
188 ByTitle,
189 ByCreationTimestamp,
190 ByModificationTimestamp,
191 ByDeletionTimestamp,
192 ByAuthor,
193 BySource,
194 BySourceApplication,
195 ByReminderTime,
196 ByPlaceName
197 };
198
199 friend QUENTIER_EXPORT QTextStream & operator<<(
200 QTextStream & strm, ListNotesOrder order);
201
202 friend QUENTIER_EXPORT QDebug & operator<<(
203 QDebug & dbg, ListNotesOrder order);
204
206
207 enum class ListSavedSearchesOrder
208 {
209 NoOrder,
210 ByUpdateSequenceNumber,
211 ByName,
212 ByFormat
213 };
214
215 friend QUENTIER_EXPORT QTextStream & operator<<(
216 QTextStream & strm, ListSavedSearchesOrder order);
217
218 friend QUENTIER_EXPORT QDebug & operator<<(
219 QDebug & dbg, ListSavedSearchesOrder order);
220
222
225 enum class Affiliation
226 {
227 Any,
228 User,
229 AnyLinkedNotebook,
230 ParticularLinkedNotebooks
231 };
232
234 QTextStream & strm, Affiliation affiliation);
235
237 QDebug & dbg, Affiliation affiliation);
238
240
242 {
243 ListOptionsBase() noexcept {}; // NOLINT
244
245 ListObjectsFilters m_filters = {};
246 quint64 m_limit = 0UL;
247 quint64 m_offset = 0UL;
248 OrderDirection m_direction = OrderDirection::Ascending;
249 };
250
252 {
253 ListNotebooksOptions() noexcept {}; // NOLINT
254
255 ListNotebooksOrder m_order = ListNotebooksOrder::NoOrder;
256 Affiliation m_affiliation = Affiliation::Any;
257 QList<qevercloud::Guid> m_linkedNotebookGuids;
258 };
259
262
265
267 {
268 ListLinkedNotebooksOptions() noexcept {}; // NOLINT
269
270 ListLinkedNotebooksOrder m_order = ListLinkedNotebooksOrder::NoOrder;
271 };
272
275
278
280 {
281 ListSavedSearchesOptions() noexcept {}; // NOLINT
282
283 ListSavedSearchesOrder m_order = ListSavedSearchesOrder::NoOrder;
284 };
285
288
291
293 {
294 ListNotesOptions() noexcept {}; // NOLINT
295
296 ListNotesOrder m_order = ListNotesOrder::NoOrder;
297 };
298
301
304
308 {
310 Any,
312 WithNotes,
314 WithoutNotes
315 };
316
318 {
319 ListTagsOptions() noexcept {}; // NOLINT
320
321 ListTagsOrder m_order = ListTagsOrder::NoOrder;
322 Affiliation m_affiliation = Affiliation::Any;
323 QList<qevercloud::Guid> m_linkedNotebookGuids;
324 TagNotesRelation m_tagNotesRelation = TagNotesRelation::Any;
325 };
326
329
331 QDebug & dbg, const ListTagsOptions & options);
332
334
335 enum class NoteCountOption
336 {
337 IncludeNonDeletedNotes = 1 << 1,
338 IncludeDeletedNotes = 1 << 2
339 };
340 Q_DECLARE_FLAGS(NoteCountOptions, NoteCountOption)
341
343 QTextStream & strm, NoteCountOption option);
344
346 QDebug & dbg, NoteCountOption option);
347
350
353
355
356 enum class UpdateNoteOption
357 {
358 UpdateResourceMetadata = 1 << 1,
359 UpdateResourceBinaryData = 1 << 2,
360 UpdateTags = 1 << 3
361 };
362 Q_DECLARE_FLAGS(UpdateNoteOptions, UpdateNoteOption)
363
365 QTextStream & strm, UpdateNoteOption option);
366
368 QDebug & dbg, UpdateNoteOption option);
369
372
375
377
378 enum class FetchNoteOption
379 {
380 WithResourceMetadata = 1 << 1,
381 WithResourceBinaryData = 1 << 2
382 };
383 Q_DECLARE_FLAGS(FetchNoteOptions, FetchNoteOption)
384
385 friend QUENTIER_EXPORT QTextStream & operator<<(
386 QTextStream & strm, FetchNoteOption option);
387
388 friend QUENTIER_EXPORT QDebug & operator<<(
389 QDebug & dbg, FetchNoteOption option);
390
391 friend QUENTIER_EXPORT QTextStream & operator<<(
392 QTextStream & strm, FetchNoteOptions options);
393
394 friend QUENTIER_EXPORT QDebug & operator<<(
395 QDebug & dbg, FetchNoteOptions options);
396
398
399 enum class FetchResourceOption
400 {
401 WithBinaryData = 1 << 1
402 };
403 Q_DECLARE_FLAGS(FetchResourceOptions, FetchResourceOption)
404
405 friend QUENTIER_EXPORT QTextStream & operator<<(
406 QTextStream & strm, FetchResourceOption option);
407
408 friend QUENTIER_EXPORT QDebug & operator<<(
409 QDebug & dbg, FetchResourceOption option);
410
411 friend QUENTIER_EXPORT QTextStream & operator<<(
412 QTextStream & strm, FetchResourceOptions options);
413
414 friend QUENTIER_EXPORT QDebug & operator<<(
415 QDebug & dbg, FetchResourceOptions options);
416
418
419 enum class HighestUsnOption
420 {
421 WithinUserOwnContent,
422 WithinUserOwnContentAndLinkedNotebooks
423 };
424
425 friend QUENTIER_EXPORT QTextStream & operator<<(
426 QTextStream & strm, HighestUsnOption option);
427
428 friend QUENTIER_EXPORT QDebug & operator<<(
429 QDebug & dbg, HighestUsnOption option);
430
431public:
432 // Versions/upgrade API
433 [[nodiscard]] virtual QFuture<bool> isVersionTooHigh() const = 0;
434 [[nodiscard]] virtual QFuture<bool> requiresUpgrade() const = 0;
435 [[nodiscard]] virtual QFuture<QList<IPatchPtr>> requiredPatches() const = 0;
436 [[nodiscard]] virtual QFuture<qint32> version() const = 0;
437 [[nodiscard]] virtual QFuture<qint32> highestSupportedVersion() const = 0;
438
439 // Users API
440 [[nodiscard]] virtual QFuture<quint32> userCount() const = 0;
441 [[nodiscard]] virtual QFuture<void> putUser(qevercloud::User user) = 0;
442
443 [[nodiscard]] virtual QFuture<std::optional<qevercloud::User>> findUserById(
444 qevercloud::UserID userId) const = 0;
445
446 [[nodiscard]] virtual QFuture<void> expungeUserById(
447 qevercloud::UserID userId) = 0;
448
449 // Notebooks API
450 [[nodiscard]] virtual QFuture<quint32> notebookCount() const = 0;
451
452 [[nodiscard]] virtual QFuture<void> putNotebook(
453 qevercloud::Notebook notebook) = 0;
454
455 [[nodiscard]] virtual QFuture<std::optional<qevercloud::Notebook>>
456 findNotebookByLocalId(QString notebookLocalId) const = 0;
457
458 [[nodiscard]] virtual QFuture<std::optional<qevercloud::Notebook>>
459 findNotebookByGuid(qevercloud::Guid guid) const = 0;
460
461 [[nodiscard]] virtual QFuture<std::optional<qevercloud::Notebook>>
462 findNotebookByName(
463 QString notebookName,
464 std::optional<qevercloud::Guid> linkedNotebookGuid =
465 std::nullopt) const = 0;
466
467 [[nodiscard]] virtual QFuture<std::optional<qevercloud::Notebook>>
468 findDefaultNotebook() const = 0;
469
470 [[nodiscard]] virtual QFuture<void> expungeNotebookByLocalId(
471 QString notebookLocalId) = 0;
472
473 [[nodiscard]] virtual QFuture<void> expungeNotebookByGuid(
474 qevercloud::Guid notebookGuid) = 0;
475
476 [[nodiscard]] virtual QFuture<void> expungeNotebookByName(
477 QString name,
478 std::optional<qevercloud::Guid> linkedNotebookGuid = std::nullopt) = 0;
479
480 [[nodiscard]] virtual QFuture<QList<qevercloud::Notebook>> listNotebooks(
481 ListNotebooksOptions options = {}) const = 0;
482
483 [[nodiscard]] virtual QFuture<QList<qevercloud::SharedNotebook>>
484 listSharedNotebooks(qevercloud::Guid notebookGuid = {}) const = 0;
485
486 [[nodiscard]] virtual QFuture<QSet<qevercloud::Guid>> listNotebookGuids(
487 ListGuidsFilters filters,
488 std::optional<qevercloud::Guid> linkedNotebookGuid = {}) const = 0;
489
490 // Linked notebooks API
491 [[nodiscard]] virtual QFuture<quint32> linkedNotebookCount() const = 0;
492
493 [[nodiscard]] virtual QFuture<void> putLinkedNotebook(
494 qevercloud::LinkedNotebook linkedNotebook) = 0;
495
496 [[nodiscard]] virtual QFuture<std::optional<qevercloud::LinkedNotebook>>
497 findLinkedNotebookByGuid(qevercloud::Guid guid) const = 0;
498
499 [[nodiscard]] virtual QFuture<void> expungeLinkedNotebookByGuid(
500 qevercloud::Guid guid) = 0;
501
502 [[nodiscard]] virtual QFuture<QList<qevercloud::LinkedNotebook>>
503 listLinkedNotebooks(ListLinkedNotebooksOptions options = {}) const = 0;
504
505 // Notes API
506 [[nodiscard]] virtual QFuture<quint32> noteCount(
507 NoteCountOptions options = NoteCountOptions(
508 NoteCountOption::IncludeNonDeletedNotes)) const = 0;
509
510 [[nodiscard]] virtual QFuture<quint32> noteCountPerNotebookLocalId(
511 QString notebookLocalId,
512 NoteCountOptions options = NoteCountOptions(
513 NoteCountOption::IncludeNonDeletedNotes)) const = 0;
514
515 [[nodiscard]] virtual QFuture<quint32> noteCountPerTagLocalId(
516 QString tagLocalId,
517 NoteCountOptions options = NoteCountOptions(
518 NoteCountOption::IncludeNonDeletedNotes)) const = 0;
519
520 [[nodiscard]] virtual QFuture<QHash<QString, quint32>> noteCountsPerTags(
521 ListTagsOptions listTagsOptions = {},
522 NoteCountOptions options = NoteCountOptions(
523 NoteCountOption::IncludeNonDeletedNotes)) const = 0;
524
525 [[nodiscard]] virtual QFuture<quint32> noteCountPerNotebookAndTagLocalIds(
526 QStringList notebookLocalIds, QStringList tagLocalIds,
527 NoteCountOptions options = NoteCountOptions(
528 NoteCountOption::IncludeNonDeletedNotes)) const = 0;
529
530 [[nodiscard]] virtual QFuture<void> putNote(qevercloud::Note note) = 0;
531
532 [[nodiscard]] virtual QFuture<void> updateNote(
533 qevercloud::Note note, UpdateNoteOptions options) = 0;
534
535 [[nodiscard]] virtual QFuture<std::optional<qevercloud::Note>>
536 findNoteByLocalId(
537 QString noteLocalId, FetchNoteOptions options) const = 0;
538
539 [[nodiscard]] virtual QFuture<std::optional<qevercloud::Note>>
540 findNoteByGuid(
541 qevercloud::Guid noteGuid, FetchNoteOptions options) const = 0;
542
543 [[nodiscard]] virtual QFuture<QList<qevercloud::Note>> listNotes(
544 FetchNoteOptions fetchOptions,
545 ListNotesOptions listOptions = {}) const = 0;
546
547 [[nodiscard]] virtual QFuture<QList<qevercloud::Note>>
548 listNotesPerNotebookLocalId(
549 QString notebookLocalId, FetchNoteOptions fetchOptions,
550 ListNotesOptions listOptions = {}) const = 0;
551
552 [[nodiscard]] virtual QFuture<QList<qevercloud::Note>>
553 listNotesPerTagLocalId(
554 QString tagLocalId, FetchNoteOptions fetchOptions,
555 ListNotesOptions listOptions = {}) const = 0;
556
557 [[nodiscard]] virtual QFuture<QList<qevercloud::Note>>
558 listNotesPerNotebookAndTagLocalIds(
559 QStringList notebookLocalIds, QStringList tagLocalIds,
560 FetchNoteOptions fetchOptions,
561 ListNotesOptions listOptions = {}) const = 0;
562
563 [[nodiscard]] virtual QFuture<QList<qevercloud::Note>> listNotesByLocalIds(
564 QStringList noteLocalIds, FetchNoteOptions fetchOptions,
565 ListNotesOptions listOptions = {}) const = 0;
566
567 [[nodiscard]] virtual QFuture<QSet<qevercloud::Guid>> listNoteGuids(
568 ListGuidsFilters filters,
569 std::optional<qevercloud::Guid> linkedNotebookGuid = {}) const = 0;
570
571 [[nodiscard]] virtual QFuture<QList<qevercloud::Note>> queryNotes(
572 NoteSearchQuery query, FetchNoteOptions fetchOptions) const = 0;
573
574 [[nodiscard]] virtual QFuture<QStringList> queryNoteLocalIds(
575 NoteSearchQuery query) const = 0;
576
577 [[nodiscard]] virtual QFuture<void> expungeNoteByLocalId(
578 QString noteLocalId) = 0;
579
580 [[nodiscard]] virtual QFuture<void> expungeNoteByGuid(
581 qevercloud::Guid noteGuid) = 0;
582
583 // Tags API
584 [[nodiscard]] virtual QFuture<quint32> tagCount() const = 0;
585 [[nodiscard]] virtual QFuture<void> putTag(qevercloud::Tag tag) = 0;
586
587 [[nodiscard]] virtual QFuture<std::optional<qevercloud::Tag>>
588 findTagByLocalId(QString tagLocalId) const = 0;
589
590 [[nodiscard]] virtual QFuture<std::optional<qevercloud::Tag>> findTagByGuid(
591 qevercloud::Guid tagGuid) const = 0;
592
593 [[nodiscard]] virtual QFuture<std::optional<qevercloud::Tag>> findTagByName(
594 QString tagName,
595 std::optional<qevercloud::Guid> linkedNotebookGuid =
596 std::nullopt) const = 0;
597
598 [[nodiscard]] virtual QFuture<QList<qevercloud::Tag>> listTags(
599 ListTagsOptions options = {}) const = 0;
600
601 [[nodiscard]] virtual QFuture<QList<qevercloud::Tag>>
602 listTagsPerNoteLocalId(
603 QString noteLocalId, ListTagsOptions options = {}) const = 0;
604
605 [[nodiscard]] virtual QFuture<QSet<qevercloud::Guid>> listTagGuids(
606 ListGuidsFilters filters,
607 std::optional<qevercloud::Guid> linkedNotebookGuid = {}) const = 0;
608
609 [[nodiscard]] virtual QFuture<void> expungeTagByLocalId(
610 QString tagLocalId) = 0;
611
612 [[nodiscard]] virtual QFuture<void> expungeTagByGuid(
613 qevercloud::Guid tagGuid) = 0;
614
615 [[nodiscard]] virtual QFuture<void> expungeTagByName(
616 QString name,
617 std::optional<qevercloud::Guid> linkedNotebookGuid = std::nullopt) = 0;
618
619 // Resources API
620 [[nodiscard]] virtual QFuture<quint32> resourceCount(
621 NoteCountOptions options = NoteCountOptions(
622 NoteCountOption::IncludeNonDeletedNotes)) const = 0;
623
624 [[nodiscard]] virtual QFuture<quint32> resourceCountPerNoteLocalId(
625 QString noteLocalId) const = 0;
626
627 [[nodiscard]] virtual QFuture<void> putResource(
628 qevercloud::Resource resource) = 0;
629
630 [[nodiscard]] virtual QFuture<std::optional<qevercloud::Resource>>
631 findResourceByLocalId(
632 QString resourceLocalId,
633 FetchResourceOptions options = {}) const = 0;
634
635 [[nodiscard]] virtual QFuture<std::optional<qevercloud::Resource>>
636 findResourceByGuid(
637 qevercloud::Guid resourceGuid,
638 FetchResourceOptions options = {}) const = 0;
639
640 [[nodiscard]] virtual QFuture<void> expungeResourceByLocalId(
641 QString resourceLocalId) = 0;
642
643 [[nodiscard]] virtual QFuture<void> expungeResourceByGuid(
644 qevercloud::Guid resourceGuid) = 0;
645
646 // Saved searches API
647 [[nodiscard]] virtual QFuture<quint32> savedSearchCount() const = 0;
648
649 [[nodiscard]] virtual QFuture<void> putSavedSearch(
650 qevercloud::SavedSearch search) = 0;
651
652 [[nodiscard]] virtual QFuture<std::optional<qevercloud::SavedSearch>>
653 findSavedSearchByLocalId(QString savedSearchLocalId) const = 0;
654
655 [[nodiscard]] virtual QFuture<std::optional<qevercloud::SavedSearch>>
656 findSavedSearchByGuid(qevercloud::Guid guid) const = 0;
657
658 [[nodiscard]] virtual QFuture<std::optional<qevercloud::SavedSearch>>
659 findSavedSearchByName(QString name) const = 0;
660
661 [[nodiscard]] virtual QFuture<QList<qevercloud::SavedSearch>>
662 listSavedSearches(ListSavedSearchesOptions options = {}) const = 0;
663
664 [[nodiscard]] virtual QFuture<QSet<qevercloud::Guid>> listSavedSearchGuids(
665 ListGuidsFilters filters) const = 0;
666
667 [[nodiscard]] virtual QFuture<void> expungeSavedSearchByLocalId(
668 QString savedSearchLocalId) = 0;
669
670 [[nodiscard]] virtual QFuture<void> expungeSavedSearchByGuid(
671 qevercloud::Guid guid) = 0;
672
673 // Synchronization API
674 [[nodiscard]] virtual QFuture<qint32> highestUpdateSequenceNumber(
675 HighestUsnOption option) const = 0;
676
677 [[nodiscard]] virtual QFuture<qint32> highestUpdateSequenceNumber(
678 qevercloud::Guid linkedNotebookGuid) const = 0;
679
686 [[nodiscard]] virtual ILocalStorageNotifier * notifier() const = 0;
687};
688
689[[nodiscard]] QUENTIER_EXPORT bool operator==(
691 const ILocalStorage::ListObjectsFilters & rhs) noexcept;
692
693[[nodiscard]] QUENTIER_EXPORT bool operator==(
695 const ILocalStorage::ListOptionsBase & rhs) noexcept;
696
697[[nodiscard]] QUENTIER_EXPORT bool operator!=(
699 const ILocalStorage::ListOptionsBase & rhs) noexcept;
700
701[[nodiscard]] QUENTIER_EXPORT bool operator==(
704
705[[nodiscard]] QUENTIER_EXPORT bool operator!=(
708
709[[nodiscard]] QUENTIER_EXPORT bool operator==(
712
713[[nodiscard]] QUENTIER_EXPORT bool operator!=(
716
717[[nodiscard]] QUENTIER_EXPORT bool operator==(
720
721[[nodiscard]] QUENTIER_EXPORT bool operator!=(
724
725[[nodiscard]] QUENTIER_EXPORT bool operator==(
727 const ILocalStorage::ListNotesOptions & rhs) noexcept;
728
729[[nodiscard]] QUENTIER_EXPORT bool operator!=(
731 const ILocalStorage::ListNotesOptions & rhs) noexcept;
732
733[[nodiscard]] QUENTIER_EXPORT bool operator==(
735 const ILocalStorage::ListTagsOptions & rhs) noexcept;
736
737[[nodiscard]] QUENTIER_EXPORT bool operator!=(
739 const ILocalStorage::ListTagsOptions & rhs) noexcept;
740
741[[nodiscard]] QUENTIER_EXPORT bool operator==(
743 const ILocalStorage::ListGuidsFilters & rhs) noexcept;
744
745[[nodiscard]] QUENTIER_EXPORT bool operator!=(
747 const ILocalStorage::ListGuidsFilters & rhs) noexcept;
748
749} // namespace quentier::local_storage
The Result template class represents the bare bones result monad implementation which either contains...
Definition Result.h:38
Definition ILocalStorageNotifier.h:28
Definition ILocalStorage.h:52
virtual ILocalStorageNotifier * notifier() const =0
Affiliation
Definition ILocalStorage.h:226
TagNotesRelation
Definition ILocalStorage.h:308