diff options
-rw-r--r-- | include/datetime/engine-eds.h | 2 | ||||
-rw-r--r-- | include/datetime/myself.h | 61 | ||||
-rw-r--r-- | src/engine-eds.cpp | 15 | ||||
-rw-r--r-- | src/myself.cpp | 73 |
4 files changed, 143 insertions, 8 deletions
diff --git a/include/datetime/engine-eds.h b/include/datetime/engine-eds.h index 12425b3..0b854e5 100644 --- a/include/datetime/engine-eds.h +++ b/include/datetime/engine-eds.h @@ -48,7 +48,7 @@ class EdsEngine: public Engine { public: EdsEngine(); - explicit EdsEngine(const std::shared_ptr<Myself> &myself); + explicit EdsEngine(const std::unique_ptr<Myself> &myself); ~EdsEngine(); void get_appointments(const DateTime& begin, diff --git a/include/datetime/myself.h b/include/datetime/myself.h new file mode 100644 index 0000000..c381780 --- /dev/null +++ b/include/datetime/myself.h @@ -0,0 +1,61 @@ +/* + * Copyright 2016 Canonical Ltd. + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 3, as published + * by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranties of + * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Authors: + * Renato Araujo Oliveira Filho <renato.filho@canonical.com> + */ + +#ifndef INDICATOR_DATETIME_MYSELF_H +#define INDICATOR_DATETIME_MYSELF_H + +#include <libaccounts-glib.h> + +#include <core/property.h> + +#include <string> +#include <vector> +#include <memory.h> + +namespace ayatana { +namespace indicator { +namespace datetime { + +class Myself +{ +public: + Myself(); + + core::Property<std::vector<std::string>>& emails() + { + return m_emails; + } + + bool isMyEmail(const std::string &email); + +private: + std::shared_ptr<AgManager> m_accounts_manager; + core::Property<std::vector<std::string> > m_emails; + + static void on_accounts_changed(AgManager*, guint, Myself*); + void reloadEmails(); + +}; + + +} // namespace datetime +} // namespace indicator +} // namespace ayatana + +#endif // INDICATOR_DATETIME_MYSELF_H diff --git a/src/engine-eds.cpp b/src/engine-eds.cpp index fc6a45b..becd40f 100644 --- a/src/engine-eds.cpp +++ b/src/engine-eds.cpp @@ -50,8 +50,7 @@ class EdsEngine::Impl { public: - Impl(const std::shared_ptr<Myself> &myself) - : m_myself(myself) + Impl(const std::unique_ptr<Myself> &myself) { auto cancellable_deleter = [](GCancellable * c) { g_cancellable_cancel(c); @@ -60,9 +59,11 @@ public: m_cancellable = std::shared_ptr<GCancellable>(g_cancellable_new(), cancellable_deleter); e_source_registry_new(m_cancellable.get(), on_source_registry_ready, this); - m_myself->emails().changed().connect([this](const std::set<std::string> &) { + + m_myself = std::unique_ptr<Myself>(new Myself()); + /*m_myself->emails().changed().connect([this](const std::set<std::string> &) { set_dirty_soon(); - }); + });*/ } ~Impl() @@ -1253,7 +1254,7 @@ private: ESourceRegistry* m_source_registry {}; guint m_rebuild_tag {}; time_t m_rebuild_deadline {}; - std::shared_ptr<Myself> m_myself; + std::unique_ptr<Myself> m_myself; }; /*** @@ -1261,11 +1262,11 @@ private: ***/ EdsEngine::EdsEngine(): - p(new Impl(std::shared_ptr<Myself>(new Myself))) + p(new Impl(std::unique_ptr<Myself>(new Myself))) { } -EdsEngine::EdsEngine(const std::shared_ptr<Myself> &myself): +EdsEngine::EdsEngine(const std::unique_ptr<Myself> &myself): p(new Impl(myself)) { } diff --git a/src/myself.cpp b/src/myself.cpp new file mode 100644 index 0000000..04c2126 --- /dev/null +++ b/src/myself.cpp @@ -0,0 +1,73 @@ +/* + * Copyright 2016 Canonical Ltd. + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 3, as published + * by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranties of + * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Authors: + * Renato Araujo Oliveira Filho <renato.filho@canonical.com> + */ + +#include "datetime/myself.h" + +#include <libaccounts-glib.h> +#include <libaccounts-glib/ag-account.h> + +#include <algorithm> + +namespace ayatana { +namespace indicator { +namespace datetime { + +Myself::Myself() + : m_accounts_manager(ag_manager_new(), g_object_unref) +{ + reloadEmails(); + g_object_connect(m_accounts_manager.get(), + "signal::account-created", on_accounts_changed, this, + "signal::account-deleted", on_accounts_changed, this, + "signal::account-updated", on_accounts_changed, this, + nullptr); +} + +bool Myself::isMyEmail(const std::string &email) +{ + auto emails = m_emails.get(); + return (std::find(emails.begin(), emails.end(), email) != emails.end()); +} + +void Myself::on_accounts_changed(AgManager *, guint, Myself *self) +{ + self->reloadEmails(); +} + +void Myself::reloadEmails() +{ + std::vector<std::string> emails; + + auto manager = m_accounts_manager.get(); + auto ids = ag_manager_list(manager); + for (auto l=ids; l!=nullptr; l=l->next) + { + auto acc = ag_manager_get_account(manager, GPOINTER_TO_UINT(l->data)); + auto account_name = ag_account_get_display_name(acc); + emails.push_back(account_name); + } + ag_manager_list_free(ids); + + m_emails.set(emails); +} + +} // namespace datetime +} // namespace indicator +} // namespace ayatana + |