[Apps Common] Updated model from Contacts. 16/98416/3
authorEugene Kurzberg <i.kurtsberg@samsung.com>
Thu, 17 Nov 2016 13:23:45 +0000 (15:23 +0200)
committerEugene Kurzberg <i.kurtsberg@samsung.com>
Thu, 17 Nov 2016 13:23:45 +0000 (15:23 +0200)
Change-Id: I007f5b7c5cf40f6d8ccf8b14eb8e7b69957bddb1
Signed-off-by: Eugene Kurzberg <i.kurtsberg@samsung.com>
14 files changed:
lib-apps-common/inc/Model/DataItem.h
lib-apps-common/inc/Model/DataProvider.h
lib-apps-common/inc/Model/SearchData.h
lib-apps-common/inc/Model/SearchEngine.h
lib-apps-common/inc/Model/SearchProvider.h
lib-apps-common/inc/Model/SearchResult.h
lib-apps-common/src/Model/DataItem.cpp
lib-apps-common/src/Model/DataProvider.cpp
lib-apps-common/src/Model/SearchEngine.cpp
lib-apps-common/src/Model/SearchProvider.cpp
lib-common/inc/Common/Model/DataConsumer.h
lib-common/inc/Common/Model/MemoProvider.h
lib-common/src/Common/Model/DataConsumer.cpp
lib-common/src/Common/Model/MemoProvider.cpp

index eae263136e5a5cc01dd813442af321f348e8778c..2fed26b0dcdacacbb1af343452739e3a3ad4c1be 100644 (file)
@@ -18,7 +18,6 @@
 #define MODEL_DATA_ITEM_H
 
 #include <functional>
-#include <memory>
 #include <tizen.h>
 
 namespace Model
@@ -49,6 +48,7 @@ namespace Model
                typedef std::function<void()> DeleteCallback;
 
                DataItem();
+               DataItem(const DataItem &);
                virtual ~DataItem() { }
 
                /**
@@ -57,6 +57,17 @@ namespace Model
                 */
                void update(void *data);
 
+               /**
+                * @return Whether is standalone (not managed by DataProvider).
+                */
+               bool isStandalone() const;
+
+               /**
+                * @brief Set whether item is standalone or managed by DataProvider.
+                * @param[in]   isStandalone    Whether item is standalone
+                */
+               void setStandalone(bool isStandalone);
+
                /**
                 * @brief Set update callback.
                 * @param[in]   callback    Update callback
@@ -70,6 +81,19 @@ namespace Model
                void setDeleteCallback(DeleteCallback callback);
 
        protected:
+               /**
+                * @brief Mark item as changed with specified change type.
+                * @param[in]   changeType  Item change type
+                * @param[in]   changes     Which item data was updated if type is ChangeUpdate
+                */
+               void setChanged(ChangeType changeType, int changes = 0);
+
+               /**
+                * @brief Called after setStandalone() to change item standalone state.
+                * @param[in]   isStandalone    Whether item is standalone
+                */
+               virtual void onStandalone(bool isStandalone) { }
+
                /**
                 * @brief Called after update() to update item data.
                 * @param[in]   data    New item data
@@ -81,6 +105,7 @@ namespace Model
                friend class DataProvider;
                void onUpdated();
 
+               bool m_IsStandalone;
                int m_Changes;
                ChangeType m_ChangeType;
 
index 22133849e6755d898559897c4470b00954b5a13d..03ca70abe686b4c18afd457fccaaaaf55cec41ab 100644 (file)
 
 #include <list>
 
+
 namespace Model
 {
-       /**
-        * @brief Unique pointer to data item
-        */
-       typedef std::unique_ptr<DataItem> DataItemPtr;
-
-       /**
-        * @brief List of data items
-        */
-       typedef std::list<DataItemPtr> DataList;
-
        class EXPORT_API DataProvider
        {
        public:
+               typedef std::list<DataItem *> DataList;
 
                /**
                 * @brief Called once initialization is finished.
@@ -43,18 +35,18 @@ namespace Model
                typedef std::function<void()> InitializeCallback;
 
                /**
-                * @brief Called after item was inserted.
-                * @param[in]   Inserted item
+                * @brief Called when provider has started or finished updating its items.
                 */
-               typedef std::function<void(DataItem &)> InsertCallback;
+               typedef std::function<void()> UpdateCallback;
 
                /**
-                * @brief Called when provider has started or finished updating its items.
+                * @brief Called after item was inserted.
+                * @param[in]   Inserted item
                 */
-               typedef std::function<void()> UpdateCallback;
+               typedef std::function<void(DataItem &)> InsertCallback;
 
                DataProvider();
-               virtual ~DataProvider() { }
+               virtual ~DataProvider();
 
                /**
                 * @return Provider data list.
@@ -76,10 +68,17 @@ namespace Model
                void update();
 
                /**
-                * @brief Set provider update mode.
-                * @param[in]   isEnabled   Whether data update is enabled.
+                * @brief Destroy dynamically allocated provider safely.
+                * @details If provider is currently busy the destruction is postponed.
+                * @remark No callbacks will be called after this method is called.
                 */
-               void setUpdateMode(bool isEnabled);
+               void destroy();
+
+               /**
+                * @brief Set whether to start update immediately when update() is called.
+                * @param[in]   isEnabled   Whether data update is enabled
+                */
+               void setUpdateEnabled(bool isEnabled);
 
                /**
                 * @brief Set insert callback.
@@ -102,22 +101,21 @@ namespace Model
        protected:
                /**
                 * @brief Called after initialize() to initialize provider data.
-                * @post onInitialized() should be called when initialization is finished.
+                * @post finishInit() should be called when initialization is finished.
                 */
-               virtual void onInitialize();
+               virtual void startInit() = 0;
 
                /**
                 * @brief Called after update() to update provider data.
-                * @post onUpdateStarted() should be called when update has started.
-                * @post onUpdateFinished() should be called when update is finished.
+                * @post finishUpdate() should be called when update is finished.
                 */
-               virtual void onUpdate();
+               virtual void startUpdate() = 0;
 
                /**
                 * @brief Insert new DataItem into the list.
                 * @param[in]   dataItem    New data item
                 */
-               void insertDataItem(DataItemPtr dataItem);
+               void insertDataItem(DataItem *dataItem);
 
                /**
                 * @brief Delete DataItem from the list.
@@ -126,27 +124,23 @@ namespace Model
                void deleteDataItem(DataItem &dataItem);
 
                /**
-                * @brief Should be called to notify that initialization is finished.
+                * @brief Should be called when initialization is finished.
                 * @param[in]   dataList    Initialized data list
                 */
-               void onInitialized(DataList dataList);
-
-               /**
-                * @brief Should be called to notify that update has started.
-                */
-               void onUpdateStarted();
+               void finishInit(DataList dataList);
 
                /**
-                * @brief Should be called to notify that update is finished.
+                * @brief Should be called when update is finished.
                 * @details Notifies clients about changes and removes deleted items from the list.
                 */
-               void onUpdateFinished();
+               void finishUpdate();
 
        private:
+               bool m_IsBusy;
                bool m_IsInitialized;
                bool m_IsUpdateEnabled;
                bool m_IsUpdatePending;
-               bool m_IsUpdating;
+               bool m_IsDestroyPending;
 
                InitializeCallback m_OnInitialized;
                InsertCallback m_OnInserted;
index e83229ba35082838cf96cd2842e24de636bf37e9..2e5d54972af33e5a8fb56871f7ac28a8b59b88b9 100644 (file)
@@ -26,41 +26,41 @@ namespace Model
        {
        public:
                /**
-                * @brief Callback to be called when SearchResult is set
+                * @brief Called when SearchResult is changed.
                 * @param[in]   Search result
                 */
                typedef std::function<void(const SearchResult *)> ChangeCallback;
 
                /**
-                * @brief Create SearchData object
+                * @brief Create SearchData object.
                 * @param[in]   dataItem     Data item reference
                 */
-               SearchData(DataItem &dataItem);
+               explicit SearchData(DataItem &dataItem);
 
                /**
-                * @return DataItem reference
+                * @return DataItem reference.
                 */
                DataItem &getDataItem();
 
                /**
-                * @return DataItem reference
+                * @return DataItem reference.
                 */
                const DataItem &getDataItem() const;
 
                /**
-                * @return Search result
+                * @return Search result.
                 */
                const SearchResult *getSearchResult() const;
 
                /**
-                * @brief Set search result
+                * @brief Set search result.
                 * @param[in]   searchResult    Search result
                 */
                void setSearchResult(SearchResult *searchResult);
 
                /**
-                * @brief Set change callback
-                * @param[in]   callback    @see ChangedCallback
+                * @brief Set change callback.
+                * @param[in]   callback    @see ChangeCallback
                 */
                void setChangeCallback(ChangeCallback callback);
 
index f9e696afb5f3f6f786b29f91a6d3758fd72b984b..846731927474f2d74ed7895aa1104a5270d53de5 100644 (file)
@@ -41,6 +41,7 @@ namespace Model
        class EXPORT_API SearchEngine
        {
        public:
+               typedef DataProvider::DataList DataList;
 
                /**
                 * @brief Create search engine
@@ -80,7 +81,7 @@ namespace Model
                template <typename List>
                void incrementalSearch(const List &list, const std::string &query);
 
-               SearchData *getSearchData(const DataItemPtr &data);
+               SearchData *getSearchData(DataItem *data);
                SearchData *getSearchData(const SearchResultItem &searchItem);
 
                void updateSearchResult(ResultList &list);
index 05efc9f906a6c081ea9a4098951aa2428bc68d97..ccb420ba5ffe5266a37ff0cbb8f96bdcf59a7286 100644 (file)
@@ -27,7 +27,6 @@ namespace Model
        class EXPORT_API SearchProvider : public DataProvider
        {
        public:
-
                /**
                 * @brief Create SearchProvider
                 * @param[in]   provider    DataProvider
@@ -48,7 +47,8 @@ namespace Model
                bool empty() const;
 
        private:
-               virtual void onInitialize() override;
+               virtual void startInit() override;
+               virtual void startUpdate() override { }
 
                SearchData *createSearchData(DataItem &dataItem);
                void onInserted(DataItem &dataItem);
index 220dd1fac73eaecc6d1fc79e21182f72d0c652c6..5c8817bffc7ca08dbfce8cbee6780be544601af8 100644 (file)
 
 namespace Model
 {
-       class SearchResult;
-
-       typedef std::unique_ptr<SearchResult> SearchResultPtr;
-
        class EXPORT_API SearchResult
        {
        public:
                /**
-                * @brief Determines range of chars, which are as substring
+                * @brief Represents substring of matched string.
                 */
                typedef Utils::Range<const char *> Substring;
 
                SearchResult();
 
                /**
-                * @brief Create SearchResult object
+                * @brief Create SearchResult object.
                 * @param[in]   fieldId   Field ID matched with query
                 * @param[in]   str       Matched string
                 * @param[in]   substr    Matched substring
@@ -46,17 +42,17 @@ namespace Model
                SearchResult(int fieldId, const char *str, Substring substr);
 
                /**
-                * @return Field ID matched with query
+                * @return Field ID matched with query.
                 */
                int getMatchedField() const;
 
                /**
-                * @return Matched string
+                * @return Matched string.
                 */
                const char *getMatchedString() const;
 
                /**
-                * @return Matched substring
+                * @return Matched substring.
                 */
                const Substring &getMatchedSubstring() const;
 
@@ -65,6 +61,8 @@ namespace Model
                const char *m_MatchedString;
                Substring m_MatchedSubstring;
        };
+
+       typedef std::unique_ptr<SearchResult> SearchResultPtr;
 }
 
 #endif /* MODEL_SEARCH_RESULT_H */
index 1f936400349f0d8d4fd2b35d96a7ba03c62d5f0b..94eee5d1ae473ce9125a0c7a630e3c2cc01aef97 100644 (file)
 using namespace Model;
 
 DataItem::DataItem()
-       : m_Changes(0), m_ChangeType(ChangeNone)
+       : m_IsStandalone(false), m_Changes(0), m_ChangeType(ChangeNone)
+{
+}
+
+DataItem::DataItem(const DataItem &that)
+       : DataItem()
 {
 }
 
 void DataItem::update(void *data)
 {
-       m_Changes = onUpdate(data);
+       m_Changes |= onUpdate(data);
        m_ChangeType = ChangeUpdate;
+
+       if (m_IsStandalone) {
+               onUpdated();
+       }
+}
+
+bool DataItem::isStandalone() const
+{
+       return m_IsStandalone;
+}
+
+void DataItem::setStandalone(bool isStandalone)
+{
+       if (m_IsStandalone != isStandalone) {
+               m_IsStandalone = isStandalone;
+               onStandalone(m_IsStandalone);
+       }
 }
 
 void DataItem::setUpdateCallback(UpdateCallback callback)
@@ -39,6 +61,20 @@ void DataItem::setDeleteCallback(DeleteCallback callback)
        m_OnDeleted = std::move(callback);
 }
 
+void DataItem::setChanged(ChangeType changeType, int changes)
+{
+       if (m_ChangeType == ChangeNone) {
+               m_ChangeType = changeType;
+       }
+       if (changeType == ChangeUpdate) {
+               m_Changes |= changes;
+       }
+
+       if (m_IsStandalone) {
+               onUpdated();
+       }
+}
+
 void DataItem::onUpdated()
 {
        switch (m_ChangeType) {
index 54597312f1ded84fb09e378ac3828e0c226f2ae3..e15abca17335c13cfa7bbd1abd25fe7e7e557599 100644 (file)
 using namespace Model;
 
 DataProvider::DataProvider()
-       : m_IsInitialized(false),
-         m_IsUpdateEnabled(true), m_IsUpdatePending(false), m_IsUpdating(false)
+       : m_IsBusy(false), m_IsInitialized(false),
+         m_IsUpdateEnabled(true), m_IsUpdatePending(false),
+         m_IsDestroyPending(false)
 {
 }
 
-const DataList &DataProvider::getDataList()
+DataProvider::~DataProvider()
+{
+       for (auto &&dataItem : m_DataList) {
+               delete dataItem;
+       }
+}
+
+const DataProvider::DataList &DataProvider::getDataList()
 {
        return m_DataList;
 }
 
 void DataProvider::initialize(InitializeCallback callback)
 {
-       if (m_IsInitialized) {
+       if (m_IsInitialized || m_IsBusy) {
                return;
        }
 
+       m_IsBusy = true;
        m_OnInitialized = std::move(callback);
-       onInitialize();
+
+       startInit();
 }
 
 void DataProvider::update()
@@ -45,16 +55,30 @@ void DataProvider::update()
                return;
        }
 
-       if (!m_IsUpdateEnabled || m_IsUpdating) {
+       if (!m_IsUpdateEnabled || m_IsBusy) {
                m_IsUpdatePending = true;
                return;
        }
 
+       m_IsBusy = true;
        m_IsUpdatePending = false;
-       onUpdate();
+       if (m_OnUpdateStarted) {
+               m_OnUpdateStarted();
+       }
+
+       startUpdate();
 }
 
-void DataProvider::setUpdateMode(bool isEnabled)
+void DataProvider::destroy()
+{
+       if (m_IsBusy) {
+               m_IsDestroyPending = true;
+       } else {
+               delete this;
+       }
+}
+
+void DataProvider::setUpdateEnabled(bool isEnabled)
 {
        m_IsUpdateEnabled = isEnabled;
        if (m_IsUpdateEnabled && m_IsUpdatePending) {
@@ -77,21 +101,10 @@ void DataProvider::setUpdateFinishCallback(UpdateCallback callback)
        m_OnUpdateFinished = std::move(callback);
 }
 
-void DataProvider::onInitialize()
-{
-       onInitialized({ });
-}
-
-void DataProvider::onUpdate()
-{
-       onUpdateStarted();
-       onUpdateFinished();
-}
-
-void DataProvider::insertDataItem(DataItemPtr dataItem)
+void DataProvider::insertDataItem(DataItem *dataItem)
 {
        dataItem->m_ChangeType = ChangeInsert;
-       m_DataList.push_back(std::move(dataItem));
+       m_DataList.push_back(dataItem);
 }
 
 void DataProvider::deleteDataItem(DataItem &dataItem)
@@ -99,26 +112,31 @@ void DataProvider::deleteDataItem(DataItem &dataItem)
        dataItem.m_ChangeType = ChangeDelete;
 }
 
-void DataProvider::onInitialized(DataList dataList)
+void DataProvider::finishInit(DataList dataList)
 {
+       if (m_IsDestroyPending) {
+               delete this;
+               return;
+       }
+
        m_DataList = std::move(dataList);
        m_IsInitialized = true;
 
        if (m_OnInitialized) {
                m_OnInitialized();
+               m_OnInitialized = nullptr;
        }
+
+       m_IsBusy = false;
 }
 
-void DataProvider::onUpdateStarted()
+void DataProvider::finishUpdate()
 {
-       m_IsUpdating = true;
-       if (m_OnUpdateStarted) {
-               m_OnUpdateStarted();
+       if (m_IsDestroyPending) {
+               delete this;
+               return;
        }
-}
 
-void DataProvider::onUpdateFinished()
-{
        for (auto it = m_DataList.begin(); it != m_DataList.end(); ) {
                auto changeType = (*it)->m_ChangeType;
                (*it)->onUpdated();
@@ -128,6 +146,7 @@ void DataProvider::onUpdateFinished()
                                m_OnInserted(**it);
                        }
                } else if (changeType == ChangeDelete) {
+                       delete *it;
                        it = m_DataList.erase(it);
                        continue;
                }
@@ -139,7 +158,7 @@ void DataProvider::onUpdateFinished()
                m_OnUpdateFinished();
        }
 
-       m_IsUpdating = false;
+       m_IsBusy = false;
        if (m_IsUpdatePending) {
                update();
        }
index 8cc9db43effe27e9c922bd565503e8aca3726363..79872b97a6942e5aab8d358f533fc9dec638e627 100644 (file)
@@ -150,9 +150,9 @@ void SearchEngine::incrementalSearch(const List &list, const std::string &query)
        }
 }
 
-SearchData *SearchEngine::getSearchData(const DataItemPtr &data)
+SearchData *SearchEngine::getSearchData(DataItem *data)
 {
-       return static_cast<SearchData *>(data.get());
+       return static_cast<SearchData *>(data);
 }
 
 SearchData *SearchEngine::getSearchData(const SearchResultItem &resultItem)
@@ -170,7 +170,7 @@ void SearchEngine::updateSearchResult(ResultList &list)
 void SearchEngine::resetSearchResult()
 {
        for (auto &&data : m_DataList) {
-               SearchData *searchData = static_cast<SearchData *>(data.get());
+               SearchData *searchData = static_cast<SearchData *>(data);
                searchData->setSearchResult(nullptr);
        }
 }
index bab3c3d47b7e49954c5bc1d88983203f1cfa030f..af7c411f38bd90ebcd4351ad4a1eee69c16ecc85 100644 (file)
@@ -24,8 +24,8 @@ SearchProvider::SearchProvider(DataProvider &provider, SearchComparator comparat
        : m_Provider(provider), m_SearchEngine(getDataList(), std::move(comparator))
 {
        m_Provider.setInsertCallback(std::bind(&SearchProvider::onInserted, this, _1));
-       m_Provider.setUpdateStartCallback(std::bind(&SearchProvider::onUpdateStarted, this));
-       m_Provider.setUpdateFinishCallback(std::bind(&SearchProvider::onUpdateFinished, this));
+       m_Provider.setUpdateStartCallback(std::bind(&SearchProvider::update, this));
+       m_Provider.setUpdateFinishCallback(std::bind(&SearchProvider::finishUpdate, this));
 }
 
 SearchProvider::~SearchProvider()
@@ -45,15 +45,15 @@ bool SearchProvider::empty() const
        return m_SearchEngine.empty();
 }
 
-void SearchProvider::onInitialize()
+void SearchProvider::startInit()
 {
        m_Provider.initialize([this] {
                DataList dataList;
                for (auto &&dataItem : m_Provider.getDataList()) {
-                       dataList.push_back(DataItemPtr(createSearchData(*dataItem)));
+                       dataList.push_back(createSearchData(*dataItem));
                }
 
-               onInitialized(std::move(dataList));
+               finishInit(std::move(dataList));
        });
 }
 
@@ -68,7 +68,7 @@ SearchData *SearchProvider::createSearchData(DataItem &dataItem)
 void SearchProvider::onInserted(DataItem &dataItem)
 {
        SearchData *searchData = createSearchData(dataItem);
-       insertDataItem(DataItemPtr(searchData));
+       insertDataItem(searchData);
        m_SearchEngine.insertSearchData(searchData);
 }
 
index 214443275f652b1724d0a8a656e229e80b3836f2..be1080e6374229c46a7024635348d07d12434f7c 100644 (file)
@@ -35,13 +35,13 @@ namespace Common
                         * @brief Get list of memo
                         * @param[in]    list           list of memos
                         */
-                       typedef std::function<void(::Model::DataList list)> MemoListReceivedCallback;
+                       typedef std::function<void(::Model::DataProvider::DataList list)> MemoListReceivedCallback;
 
                        /**
                         * @brief Get memo
                         * @param[in]    memo           Memo
                         */
-                       typedef std::function<void(::Model::DataItemPtr memo)> MemoReceivedCallback;
+                       typedef std::function<void(::Model::DataItem *memo)> MemoReceivedCallback;
 
                        /**
                         * @brief Called when memo data has been changed.
@@ -129,7 +129,7 @@ namespace Common
                                        result_set_cursor cursor, bool providerResult, const char *error);
 
                        void initialize();
-                       ::Model::DataItemPtr createMemo(result_set_cursor cursor, int columnCount);
+                       Memo *createMemo(result_set_cursor cursor, int columnCount);
                        void setMemoContent(Memo *memo, result_set_cursor cursor, int column);
                        void setMemoImages(Memo *memo, char *image);
                        bundle *prepareBundle(Memo *memo);
index d672f99a17bf710df1282c674f1cf895768539e2..a4acbb070486ea3e539f0c2d7a973bbf6c2d3aea 100644 (file)
@@ -71,15 +71,14 @@ namespace Common
 
                protected:
                        /**
-                        * @see DataProvider::onInitialize().
+                        * @see DataProvider::startInit().
                         */
-                       virtual void onInitialize() override;
+                       virtual void startInit() override;
 
                        /**
-                        * @see DataProvider::onUpdate().
+                        * @see DataProvider::startUpdate().
                         */
-                       virtual void onUpdate() override;
-
+                       virtual void startUpdate() override;
 
                private:
                        struct UpdateInfo
@@ -88,7 +87,7 @@ namespace Common
                                data_control_data_change_type_e type;
                        };
 
-                       void onMemoReceived(::Model::DataItemPtr newItem, long long id, data_control_data_change_type_e type);
+                       void onMemoReceived(::Model::DataItem *newItem, long long id, data_control_data_change_type_e type);
                        void onMemoDataChanged(long long id, data_control_data_change_type_e type);
 
                        void getMemoFromDB(long long id, data_control_data_change_type_e type);
index 85ebbda893e7966805660ee66bf0a483ca24e6b6..0d42977aebb0f8bae24cd59f68dfd9d163bf2f6f 100644 (file)
@@ -149,12 +149,12 @@ void DataConsumer::onSelectResponse(int requestId, data_control_h provider, resu
 {
        RETM_IF(!providerResult, "onSelectResponse() failed.");
 
-       DataList list;
+       DataProvider::DataList list;
 
        int res = data_control_sql_step_first(cursor);
 
        while (res == DATA_CONTROL_ERROR_NONE) {
-               list.push_back(DataItemPtr(MemoBuilder::createMemo(cursor)));
+               list.push_back(MemoBuilder::createMemo(cursor));
                res = data_control_sql_step_next(cursor);
        }
 
index 1a6145497d071a644f7585a9807c0e120e6e3586..b3dfe533dc5e819d513a8f7b7f3c33a53071bc3f 100644 (file)
@@ -47,7 +47,7 @@ void MemoProvider::unsetResultCallback()
 Memo *MemoProvider::getMemo(long long id)
 {
        for (auto &&dataItem : getDataList()) {
-               auto memo = (Memo *)dataItem.get();
+               auto memo = static_cast<Memo *>(dataItem);
                if (memo->getId() == id) {
                        return memo;
                }
@@ -71,15 +71,13 @@ void MemoProvider::deleteMemo(Memo *memo)
        m_Consumer.removeMemo(memo);
 }
 
-void MemoProvider::onInitialize()
+void MemoProvider::startInit()
 {
-       m_Consumer.getMemoList(std::bind(&MemoProvider::onInitialized, this, _1));
+       m_Consumer.getMemoList(std::bind(&MemoProvider::finishInit, this, _1));
 }
 
-void MemoProvider::onUpdate()
+void MemoProvider::startUpdate()
 {
-       onUpdateStarted();
-
        for (auto it = m_Updates.begin(); it != m_Updates.end();) {
                if (it->type == DATA_CONTROL_DATA_CHANGE_SQL_DELETE) {
                        if (Memo *memo = getMemo(it->id)) {
@@ -95,7 +93,7 @@ void MemoProvider::onUpdate()
        }
 
        if (m_Updates.empty()) {
-               onUpdateFinished();
+               finishUpdate();
        }
 }
 
@@ -105,14 +103,14 @@ void MemoProvider::onMemoDataChanged(long long id, data_control_data_change_type
        update();
 }
 
-void MemoProvider::onMemoReceived(DataItemPtr newItem, long long id, data_control_data_change_type_e type)
+void MemoProvider::onMemoReceived(::Model::DataItem *newItem, long long id, data_control_data_change_type_e type)
 {
        if (type == DATA_CONTROL_DATA_CHANGE_SQL_INSERT) {
-               insertDataItem(std::move(newItem));
+               insertDataItem(newItem);
 
        } else if (type == DATA_CONTROL_DATA_CHANGE_SQL_UPDATE) {
                if (Memo *memo = getMemo(id)) {
-                       memo->update(newItem.get());
+                       memo->update(newItem);
                }
        }
 
@@ -124,7 +122,7 @@ void MemoProvider::onMemoReceived(DataItemPtr newItem, long long id, data_contro
        }
 
        if (m_Updates.empty()) {
-               onUpdateFinished();
+               finishUpdate();
        }
 }