[geary: 47/66] Merge branch 'mainline' into remove-old-msgs-beyond-storage-pref



commit 4ff783b231cc18ae8f3c3ded3469bcfe6f7c98fc
Merge: 01e114f09 223546773
Author: Chris Heywood <15127-creywood users noreply gitlab gnome org>
Date:   Thu Apr 30 18:08:19 2020 +1000

    Merge branch 'mainline' into remove-old-msgs-beyond-storage-pref

 .gitlab-ci.yml                                     |   15 +-
 INSTALL                                            |   21 +-
 Makefile                                           |  102 -
 NEWS                                               |  115 +
 THANKS                                             |   21 +-
 code-of-conduct.md                                 |   12 +-
 desktop/org.gnome.Geary.appdata.xml.in.in          |   34 +-
 desktop/org.gnome.Geary.gschema.xml                |    6 +
 help/C/shortcuts.page                              |    1 +
 help/LINGUAS                                       |    1 +
 help/ca/ca.po                                      | 1512 ++++++
 help/it/it.po                                      |  635 ++-
 icons/format-toolbar-toggle-symbolic.svg           |   76 +
 icons/meson.build                                  |    1 +
 meson.build                                        |   56 +-
 meson_options.txt                                  |   11 +-
 org.gnome.Geary.json                               |   66 +-
 org.gnome.Geary.yml => org.gnome.Geary.yaml        |   50 +-
 po/POTFILES.in                                     |   52 +-
 po/ca.po                                           | 3186 ++++++-------
 po/da.po                                           | 3311 +++++++------
 po/de.po                                           | 3050 +++++++-----
 po/el.po                                           | 3205 +++++++------
 po/es.po                                           | 1163 ++---
 po/eu.po                                           | 2330 ++++++----
 po/fi.po                                           | 2466 +++++-----
 po/hr.po                                           | 4780 ++++++++++++++-----
 po/hu.po                                           | 2140 +++++----
 po/id.po                                           |  984 ++--
 po/it.po                                           | 2032 ++++----
 po/ja.po                                           | 2404 ++++++----
 po/nl.po                                           | 3104 ++++++++-----
 po/pl.po                                           | 1100 +++--
 po/pt_BR.po                                        | 1651 ++++---
 po/sv.po                                           | 1453 +++---
 po/tr.po                                           | 1190 ++---
 po/uk.po                                           | 4609 ++++++++++++-------
 po/zh_TW.po                                        | 4848 ++++++++++++++------
 src/client/accounts/accounts-editor-edit-pane.vala |    4 +-
 src/client/accounts/accounts-editor-row.vala       |    7 +-
 src/client/accounts/accounts-editor.vala           |    4 +-
 src/client/accounts/accounts-manager.vala          |  131 +-
 .../accounts/accounts-signature-web-view.vala      |    4 +-
 .../application/application-account-context.vala   |  146 +
 .../application/application-avatar-store.vala      |    5 +-
 src/client/application/application-client.vala     |  251 +-
 .../application/application-configuration.vala     |   21 +-
 .../application/application-contact-store.vala     |   21 +-
 src/client/application/application-contact.vala    |   15 +
 src/client/application/application-controller.vala |  827 ++--
 .../application-email-plugin-context.vala          |   95 +
 .../application-email-store-factory.vala           |  288 ++
 .../application/application-folder-context.vala    |  108 +
 .../application-folder-plugin-context.vala         |  102 +
 .../application-folder-store-factory.vala          |  335 ++
 .../application/application-main-window.vala       |  567 +--
 .../application-notification-context.vala          |  296 --
 .../application-notification-plugin-context.vala   |  329 ++
 .../application/application-plugin-manager.vala    |  602 ++-
 src/client/application/main.vala                   |   19 +-
 ...mponents-web-view.vala => client-web-view.vala} |  156 +-
 .../components/components-info-bar-stack.vala      |  193 +
 src/client/components/components-info-bar.vala     |  108 +
 .../components/components-inspector-log-view.vala  |  262 +-
 src/client/components/components-inspector.vala    |   18 +
 .../components/components-preferences-window.vala  |  151 +-
 ...ala => components-problem-report-info-bar.vala} |   50 +-
 src/client/composer/composer-box.vala              |    2 +-
 src/client/composer/composer-email-entry.vala      |   29 +-
 src/client/composer/composer-embed.vala            |    6 +-
 src/client/composer/composer-headerbar.vala        |   11 +-
 src/client/composer/composer-link-popover.vala     |   30 +-
 src/client/composer/composer-web-view.vala         |   12 +-
 src/client/composer/composer-widget.vala           |  650 +--
 src/client/composer/composer-window.vala           |    2 +-
 src/client/composer/contact-entry-completion.vala  |   94 +-
 src/client/composer/spell-check-popover.vala       |   73 +-
 .../conversation-list/conversation-list-view.vala  |    4 +-
 .../formatted-conversation-data.vala               |    2 +-
 .../conversation-contact-popover.vala              |   10 +-
 .../conversation-viewer/conversation-email.vala    |   50 +-
 .../conversation-viewer/conversation-list-box.vala |  155 +-
 .../conversation-viewer/conversation-message.vala  |  355 +-
 .../conversation-viewer/conversation-viewer.vala   |   37 +-
 .../conversation-viewer/conversation-web-view.vala |   46 +-
 src/client/dialogs/alert-dialog.vala               |    1 -
 .../folder-list/folder-list-account-branch.vala    |   82 +-
 .../folder-list/folder-list-folder-entry.vala      |  133 +-
 .../folder-list-inbox-folder-entry.vala            |   10 +-
 .../folder-list/folder-list-inboxes-branch.vala    |    8 +-
 .../folder-list/folder-list-search-branch.vala     |    6 +-
 src/client/folder-list/folder-list-tree.vala       |  136 +-
 src/client/meson.build                             |   67 +-
 ....in => desktop-notifications.plugin.desktop.in} |    3 +-
 .../desktop-notifications.vala                     |  303 +-
 .../plugin/desktop-notifications/meson.build       |    8 +-
 .../email-templates.plugin.desktop.in              |    4 +
 .../plugin/email-templates/email-templates.vala    |  364 ++
 src/client/plugin/email-templates/meson.build      |   26 +
 .../folder-highlight.plugin.desktop.in             |    4 +
 .../plugin/folder-highlight/folder-highlight.vala  |   99 +
 src/client/plugin/folder-highlight/meson.build     |   26 +
 src/client/plugin/meson.build                      |    9 +
 src/client/plugin/messaging-menu/meson.build       |   10 +-
 ....plugin.in => messaging-menu.plugin.desktop.in} |    3 +-
 .../plugin/messaging-menu/messaging-menu.vala      |  112 +-
 src/client/plugin/notification-badge/meson.build   |    6 +-
 .../notification-badge.plugin.desktop.in           |    4 +
 .../notification-badge.plugin.in                   |    5 -
 .../notification-badge/notification-badge.vala     |   90 +-
 src/client/plugin/plugin-account.vala              |   21 +
 src/client/plugin/plugin-application.vala          |   64 +
 src/client/plugin/plugin-button.vala               |   36 +
 src/client/plugin/plugin-composer.vala             |   50 +
 src/client/plugin/plugin-contact-store.vala        |   41 +
 src/client/plugin/plugin-email-extension.vala      |   78 +
 src/client/plugin/plugin-email-store.vala          |   47 +
 src/client/plugin/plugin-email.vala                |   60 +
 src/client/plugin/plugin-error.vala                |   30 +
 src/client/plugin/plugin-folder-extension.vala     |   97 +
 src/client/plugin/plugin-folder-store.vala         |   67 +
 src/client/plugin/plugin-folder.vala               |   44 +
 src/client/plugin/plugin-info-bar.vala             |   70 +
 .../plugin/plugin-notification-extension.vala      |  126 +
 src/client/plugin/plugin-notification.vala         |   29 -
 src/client/plugin/plugin-plugin-base.vala          |   47 +
 src/client/plugin/plugin-trusted-extension.vala    |   40 +
 src/client/plugin/sent-sound/meson.build           |   29 +
 .../plugin/sent-sound/sent-sound.plugin.desktop.in |    4 +
 src/client/plugin/sent-sound/sent-sound.vala       |   55 +
 src/client/plugin/special-folders/meson.build      |   26 +
 .../special-folders.plugin.desktop.in              |    3 +
 .../plugin/special-folders/special-folders.vala    |  239 +
 src/client/sidebar/sidebar-common.vala             |    2 +-
 src/client/sidebar/sidebar-entry.vala              |    9 +-
 src/client/sidebar/sidebar-tree.vala               |  110 +-
 src/client/util/util-avatar.vala                   |   14 +-
 src/client/util/util-cache.vala                    |   11 +-
 src/client/util/util-email.vala                    |    7 +-
 .../{util-international.vala => util-i18n.vala}    |   70 +-
 src/client/web-process/web-process-extension.vala  |   43 +-
 src/console/main.vala                              |   18 +-
 src/engine/api/geary-account-information.vala      |  169 +-
 src/engine/api/geary-account.vala                  |   33 +-
 src/engine/api/geary-base-object.vala              |    2 +-
 src/engine/api/geary-client-service.vala           |   19 +-
 src/engine/api/geary-engine.vala                   |   10 +-
 src/engine/api/geary-folder.vala                   |  149 +-
 src/engine/api/geary-logging.vala                  |  607 ---
 src/engine/api/geary-problem-report.vala           |   33 +-
 src/engine/api/geary-special-folder-type.vala      |   46 +-
 src/engine/app/app-conversation-monitor.vala       |  155 +-
 src/engine/app/app-draft-manager.vala              |  109 +-
 src/engine/app/app-search-folder.vala              |   33 +-
 .../conversation-monitor/app-conversation-set.vala |   29 +-
 src/engine/common/common-contact-harvester.vala    |    7 +-
 src/engine/db/db-connection.vala                   |    8 +-
 src/engine/db/db-context.vala                      |   63 +-
 src/engine/db/db-result.vala                       |   34 +-
 src/engine/db/db-statement.vala                    |    4 +-
 .../gmail/imap-engine-gmail-account.vala           |   40 +-
 .../gmail/imap-engine-gmail-all-mail-folder.vala   |    5 +-
 .../gmail/imap-engine-gmail-drafts-folder.vala     |    5 +-
 .../gmail/imap-engine-gmail-folder.vala            |    8 +-
 .../gmail/imap-engine-gmail-spam-trash-folder.vala |    4 +-
 .../imap-engine/imap-engine-account-operation.vala |    5 -
 .../imap-engine/imap-engine-account-processor.vala |    5 -
 .../imap-engine-account-synchronizer.vala          |    5 -
 .../imap-engine/imap-engine-generic-account.vala   |  300 +-
 .../imap-engine/imap-engine-generic-folder.vala    |    8 +-
 .../imap-engine/imap-engine-minimal-folder.vala    |   47 +-
 .../imap-engine/imap-engine-replay-queue.vala      |   80 +-
 .../other/imap-engine-other-account.vala           |   12 +-
 .../other/imap-engine-other-folder.vala            |    5 +-
 .../outlook/imap-engine-outlook-account.vala       |   16 +-
 .../outlook/imap-engine-outlook-drafts-folder.vala |    5 +-
 .../outlook/imap-engine-outlook-folder.vala        |    4 +-
 .../yahoo/imap-engine-yahoo-account.vala           |   12 +-
 .../yahoo/imap-engine-yahoo-folder.vala            |    4 +-
 src/engine/imap/api/imap-account-session.vala      |   24 +-
 .../imap/{response => api}/imap-capabilities.vala  |   47 +-
 src/engine/imap/api/imap-client-service.vala       |  137 +-
 src/engine/imap/api/imap-session-object.vala       |    7 +-
 src/engine/imap/command/imap-command.vala          |    6 +-
 src/engine/imap/command/imap-create-command.vala   |   36 +-
 src/engine/imap/imap-error.vala                    |    7 +-
 .../imap/response/imap-mailbox-attribute.vala      |  127 +-
 .../imap/response/imap-mailbox-attributes.vala     |   57 +-
 .../imap/response/imap-mailbox-information.vala    |    2 +-
 src/engine/imap/response/imap-response-code.vala   |   16 +-
 src/engine/imap/response/imap-server-data.vala     |   20 +-
 .../imap/transport/imap-client-connection.vala     |  227 +-
 src/engine/imap/transport/imap-client-session.vala |  625 ++-
 src/engine/imap/transport/imap-deserializer.vala   |  131 +-
 src/engine/imap/transport/imap-serializer.vala     |   80 +-
 src/engine/meson.build                             |    4 +-
 src/engine/outbox/outbox-folder.vala               |   11 +-
 .../rfc822/rfc822-gmime-filter-blockquotes.vala    |    6 +-
 src/engine/rfc822/rfc822-gmime-filter-flowed.vala  |    4 +-
 src/engine/rfc822/rfc822-gmime-filter-plain.vala   |    4 +-
 src/engine/rfc822/rfc822-message.vala              |   46 +-
 src/engine/rfc822/rfc822-utils.vala                |   10 +-
 src/engine/smtp/smtp-client-connection.vala        |   58 +-
 src/engine/smtp/smtp-client-service.vala           |   22 +-
 src/engine/smtp/smtp-client-session.vala           |   34 +-
 src/engine/util/util-connectivity-manager.vala     |    2 +-
 src/engine/util/util-generic-capabilities.vala     |   82 +-
 src/engine/util/util-logging.vala                  |  613 ++-
 src/engine/util/util-stream.vala                   |   74 -
 src/mailer/main.vala                               |    3 +-
 src/meson.build                                    |   58 +-
 src/sqlite3-unicodesn/meson.build                  |    4 +-
 test/client/accounts/accounts-manager-test.vala    |   39 +-
 ...st-case.vala => client-web-view-test-case.vala} |   28 +-
 ...eb-view-test.vala => client-web-view-test.vala} |   10 +-
 test/client/composer/composer-web-view-test.vala   |   30 +-
 test/client/util/util-avatar-test.vala             |    2 +
 test/engine/api/geary-account-mock.vala            |   18 +-
 test/engine/api/geary-attachment-test.vala         |   36 +-
 test/engine/api/geary-folder-mock.vala             |   35 +-
 test/engine/app/app-conversation-monitor-test.vala |   76 +-
 test/engine/app/app-conversation-set-test.vala     |    2 +-
 test/engine/app/app-conversation-test.vala         |    2 +-
 .../common/common-contact-harvester-test.vala      |   30 +-
 .../common/common-contact-store-impl-test.vala     |   28 +-
 test/engine/db/db-database-test.vala               |   21 +-
 test/engine/db/db-versioned-database-test.vala     |    3 +-
 test/engine/imap-db/imap-db-account-test.vala      |   38 +-
 test/engine/imap-db/imap-db-attachment-test.vala   |    4 +-
 test/engine/imap-db/imap-db-database-test.vala     |    6 +-
 test/engine/imap-db/imap-db-folder-test.vala       |   28 +-
 .../imap-engine-generic-account-test.vala          |   10 +-
 .../imap/command/imap-create-command-test.vala     |    2 +-
 .../transport/imap-client-connection-test.vala     |  160 +
 .../imap/transport/imap-client-session-test.vala   |  415 ++
 .../imap/transport/imap-deserializer-test.vala     |   48 +-
 test/engine/rfc822-message-test.vala               |  111 +-
 test/engine/rfc822-utils-test.vala                 |   31 +
 test/engine/util-timeout-manager-test.vala         |   10 +-
 test/integration/imap/client-session.vala          |   16 +-
 test/integration/smtp/client-session.vala          |   12 +-
 ...state-test.vala => client-page-state-test.vala} |   16 +-
 test/js/composer-page-state-test.vala              |    2 +-
 test/js/conversation-page-state-test.vala          |    2 +-
 test/meson.build                                   |    9 +-
 test/mock-object.vala                              |  217 +-
 test/test-case.vala                                |  143 +-
 test/test-client.vala                              |   10 +-
 test/test-engine.vala                              |   16 +-
 test/test-server.vala                              |  222 +
 ui/application-main-window.ui                      |  319 +-
 ui/client-web-view-allow-remote-images.js          |   11 +
 ui/{components-web-view.js => client-web-view.js}  |    5 +-
 ui/components-inspector-log-view.ui                |  106 +-
 ui/components-inspector.ui                         |   58 +-
 ui/composer-link-popover.ui                        |   43 +-
 ui/composer-web-view.css                           |    1 +
 ui/composer-web-view.js                            |    4 +-
 ui/composer-widget.ui                              |   21 +-
 ui/conversation-email.ui                           |  137 +-
 ui/conversation-message.ui                         |  146 +-
 ui/geary.css                                       |   20 +-
 ui/main-toolbar-menus.ui                           |   16 +-
 ui/main-window-info-bar.ui                         |   80 -
 ui/org.gnome.Geary.gresource.xml                   |    4 +-
 265 files changed, 42544 insertions(+), 26561 deletions(-)
---
diff --cc src/client/application/application-controller.vala
index 8c95cab2b,becc3acd8..dc9aa23f8
--- a/src/client/application/application-controller.vala
+++ b/src/client/application/application-controller.vala
@@@ -1405,45 -1408,10 +1420,39 @@@ internal class Application.Controller 
          }
      }
  
 +    /**
 +     * Track a window receiving focus, for idle background work.
 +     */
 +    public void window_focus_in() {
 +        this.all_windows_backgrounded_timeout.reset();
 +
 +        if (this.storage_cleanup_cancellable != null) {
 +            this.storage_cleanup_cancellable.cancel();
 +
 +            // Cleanup was still running and we don't know where we got to so
 +            // we'll clear each of these so it runs next time we're in the
 +            // background
 +            foreach (AccountContext context in this.accounts.values) {
 +                context.cancellable.cancelled.disconnect(this.storage_cleanup_cancellable.cancel);
 +
 +                Geary.Account account = context.account;
 +                account.last_storage_cleanup = null;
 +            }
 +            this.storage_cleanup_cancellable = null;
 +        }
 +    }
 +
 +    /**
 +     * Track a window going unfocused, for idle background work.
 +     */
 +    public void window_focus_out() {
 +        this.all_windows_backgrounded_timeout.start();
 +    }
 +
      /** Displays a composer on the last active main window. */
-     internal void show_composer(Composer.Widget composer,
-                                 Gee.Collection<Geary.EmailIdentifier>? refers_to,
-                                 MainWindow? show_on) {
-         var target = show_on;
-         if (target == null) {
-             target = this.application.get_active_main_window();
-         }
- 
-         target.show_composer(composer, refers_to);
+     internal void show_composer(Composer.Widget composer) {
+         var target = this.application.get_active_main_window();
+         target.show_composer(composer);
          composer.set_focus();
      }
  
diff --cc src/engine/api/geary-account.vala
index 432fa3641,e08f9cc06..34d67a30c
--- a/src/engine/api/geary-account.vala
+++ b/src/engine/api/geary-account.vala
@@@ -279,16 -255,6 +279,11 @@@ public abstract class Geary.Account : B
      public signal void email_flags_changed(Geary.Folder folder,
          Gee.Map<Geary.EmailIdentifier, Geary.EmailFlags> map);
  
 +    /**
 +     * Fired when last_storage_cleanup changes.
 +     */
 +    public signal void last_storage_cleanup_changed(GLib.DateTime? new_value);
 +
-     /** {@inheritDoc} */
-     public Logging.Flag logging_flags {
-         get; protected set; default = Logging.Flag.ALL;
-     }
- 
      /** {@inheritDoc} */
      public Logging.Source? logging_parent { get { return null; } }
  
diff --cc src/engine/app/app-search-folder.vala
index bdc3f743b,f161c9fcf..85c8c75c6
--- a/src/engine/app/app-search-folder.vala
+++ b/src/engine/app/app-search-folder.vala
@@@ -126,10 -126,9 +126,10 @@@ public class Geary.App.SearchFolder 
          this._path = root.get_child(MAGIC_BASENAME, Trillian.TRUE);
  
          account.folders_available_unavailable.connect(on_folders_available_unavailable);
-         account.folders_special_type.connect(on_folders_special_type);
+         account.folders_use_changed.connect(on_folders_use_changed);
          account.email_locally_complete.connect(on_email_locally_complete);
          account.email_removed.connect(on_account_email_removed);
 +        account.email_locally_removed.connect(on_account_email_removed);
  
          new_contents();
  
@@@ -140,10 -139,9 +140,10 @@@
  
      ~SearchFolder() {
          account.folders_available_unavailable.disconnect(on_folders_available_unavailable);
-         account.folders_special_type.disconnect(on_folders_special_type);
+         account.folders_use_changed.disconnect(on_folders_use_changed);
          account.email_locally_complete.disconnect(on_email_locally_complete);
          account.email_removed.disconnect(on_account_email_removed);
 +        account.email_locally_removed.disconnect(on_account_email_removed);
      }
  
      /**
diff --cc src/engine/imap-engine/imap-engine-generic-account.vala
index 89881c9be,6a83ff01d..1c3097b0d
--- a/src/engine/imap-engine/imap-engine-generic-account.vala
+++ b/src/engine/imap-engine/imap-engine-generic-account.vala
@@@ -17,15 -17,12 +17,15 @@@ private abstract class Geary.ImapEngine
      // we don't need to double check.
      private const int REFRESH_FOLDER_LIST_SEC = 15 * 60;
  
 +    /** Minimum interval between account storage cleanup work */
 +    private const uint APP_BACKGROUNDED_CLEANUP_WORK_INTERVAL_MINUTES = 60 * 24;
 +
-     private const Geary.SpecialFolderType[] SUPPORTED_SPECIAL_FOLDERS = {
-         Geary.SpecialFolderType.DRAFTS,
-         Geary.SpecialFolderType.SENT,
-         Geary.SpecialFolderType.SPAM,
-         Geary.SpecialFolderType.TRASH,
-         Geary.SpecialFolderType.ARCHIVE,
+     private const Folder.SpecialUse[] SUPPORTED_SPECIAL_FOLDERS = {
+         DRAFTS,
+         SENT,
+         JUNK,
+         TRASH,
+         ARCHIVE,
      };
  
      private static GLib.VariantType email_id_type = new GLib.VariantType(
diff --cc test/engine/imap-db/imap-db-folder-test.vala
index 7bd023842,17baabdc9..eac4c0b85
--- a/test/engine/imap-db/imap-db-folder-test.vala
+++ b/test/engine/imap-db/imap-db-folder-test.vala
@@@ -324,70 -323,6 +324,70 @@@ class Geary.ImapDB.FolderTest : TestCas
          assert_flags(test, test_flags);
      }
  
 +    public void detach_emails_before_timestamp() throws GLib.Error {
 +        // Ensures that messages outside the folder and within the epoch aren't
 +        // removed, and that messages meeting the criteria are removed.
 +
 +        this.account.db.exec(
 +            "INSERT INTO FolderTable (id, name) VALUES (2, 'other');"
 +        );
 +
 +        GLib.DateTime threshold = new GLib.DateTime.local(2020, 1, 1, 0, 0, 0);
 +        GLib.DateTime beyond_threshold = new GLib.DateTime.local(2019, 1, 1, 0, 0, 0);
 +        GLib.DateTime within_threshold = new GLib.DateTime.local(2021, 1, 1, 0, 0, 0);
 +
 +        Email.Field fixture_fields = Email.Field.RECEIVERS;
 +        string fixture_to = "test1 example com";
 +        this.account.db.exec(
 +            "INSERT INTO MessageTable (id, fields, to_field, internaldate_time_t) " +
 +            "VALUES (1, %d, '%s', %s);".printf(fixture_fields,
 +                                               fixture_to,
 +                                               within_threshold.to_unix().to_string())
 +        );
 +        this.account.db.exec(
 +            "INSERT INTO MessageTable (id, fields, to_field, internaldate_time_t) " +
 +            "VALUES (2, %d, '%s', %s);".printf(fixture_fields,
 +                                               fixture_to,
 +                                               within_threshold.to_unix().to_string())
 +        );
 +        this.account.db.exec(
 +            "INSERT INTO MessageTable (id, fields, to_field, internaldate_time_t) " +
 +            "VALUES (3, %d, '%s', %s);".printf(fixture_fields,
 +                                               fixture_to,
 +                                               beyond_threshold.to_unix().to_string())
 +        );
 +
 +        this.account.db.exec("""
 +            INSERT INTO MessageLocationTable
 +                (id, message_id, folder_id, ordering, remove_marker)
 +                VALUES
 +                (1, 1, 1, 1, 1),
 +                (2, 2, 2, 1, 1),
 +                (3, 3, 1, 2, 1);
 +        """);
 +
 +        this.folder.detach_emails_before_timestamp.begin(
 +            threshold,
 +            null,
-             (obj, ret) => { async_complete(ret); }
++            this.async_completion
 +        );
 +        this.folder.detach_emails_before_timestamp.end(async_result());
 +
 +        int64[] expected = { 1, 2 };
 +        Db.Result result = this.account.db.query(
 +            "SELECT id FROM MessageLocationTable"
 +        );
 +
 +        int i = 0;
 +        while (!result.finished) {
 +            assert_true(i < expected.length, "Too many rows");
 +            assert_int64(expected[i], result.int64_at(0));
 +            i++;
 +            result.next();
 +        }
 +        assert_true(i == expected.length, "Not enough rows");
 +    }
 +
      private Email new_mock_remote_email(int64 uid,
                                          string? subject = null,
                                          Geary.EmailFlags? flags = null) {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]