[geary/mjog/746-gmail-flag-quote-bug: 3/5] Geary.Imap: Add Quirks object to collect all IMAP service quirk config
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/mjog/746-gmail-flag-quote-bug: 3/5] Geary.Imap: Add Quirks object to collect all IMAP service quirk config
- Date: Sat, 2 May 2020 04:33:40 +0000 (UTC)
commit 7d1bbf337e85917d0745019ebeb5724c88e4539d
Author: Michael Gratton <mike vee net>
Date: Fri May 1 15:40:18 2020 +1000
Geary.Imap: Add Quirks object to collect all IMAP service quirk config
src/console/main.vala | 3 ++-
src/engine/api/geary-engine.vala | 5 ++++-
src/engine/imap/api/imap-client-service.vala | 15 ++++++++++++---
src/engine/imap/api/imap-quirks.vala | 18 ++++++++++++++++++
.../imap/transport/imap-client-connection.vala | 7 ++++++-
src/engine/imap/transport/imap-client-session.vala | 6 ++++--
src/engine/imap/transport/imap-deserializer.vala | 7 ++++++-
src/engine/meson.build | 1 +
.../imap/transport/imap-client-connection-test.vala | 8 +++++---
.../imap/transport/imap-client-session-test.vala | 20 ++++++++++----------
.../imap/transport/imap-deserializer-test.vala | 2 +-
test/integration/imap/client-session.vala | 5 ++++-
12 files changed, 73 insertions(+), 24 deletions(-)
---
diff --git a/src/console/main.vala b/src/console/main.vala
index 70e961f8..b114c7e3 100644
--- a/src/console/main.vala
+++ b/src/console/main.vala
@@ -315,7 +315,8 @@ class ImapConsole : Gtk.Window {
new GLib.NetworkAddress(args[0], Geary.Imap.IMAP_TLS_PORT),
method,
IMAP_TIMEOUT_SEC
- )
+ ),
+ new Geary.Imap.Quirks()
);
cx.sent_command.connect(on_sent_command);
diff --git a/src/engine/api/geary-engine.vala b/src/engine/api/geary-engine.vala
index 157eb2b1..5f8f7143 100644
--- a/src/engine/api/geary-engine.vala
+++ b/src/engine/api/geary-engine.vala
@@ -284,7 +284,10 @@ public class Geary.Engine : BaseObject {
(security, cx) => account.untrusted_host(service, security, cx)
);
- var client = new Imap.ClientSession(endpoint);
+ var client = new Imap.ClientSession(
+ endpoint,
+ Imap.ClientService.new_quirks_for_provider(account.service_provider)
+ );
GLib.Error? imap_err = null;
try {
yield client.connect_async(
diff --git a/src/engine/imap/api/imap-client-service.vala b/src/engine/imap/api/imap-client-service.vala
index a9feabd9..80fe752b 100644
--- a/src/engine/imap/api/imap-client-service.vala
+++ b/src/engine/imap/api/imap-client-service.vala
@@ -39,6 +39,12 @@ public class Geary.Imap.ClientService : Geary.ClientService {
private const int CHECK_NOOP_THRESHOLD_SEC = 5;
+ public static Quirks new_quirks_for_provider(ServiceProvider provider) {
+ var quirks = new Quirks();
+ return quirks;
+ }
+
+
/**
* Set to zero or negative value if keepalives should be disabled when a connection has not
* selected a mailbox. (This is not recommended.)
@@ -101,6 +107,8 @@ public class Geary.Imap.ClientService : Geary.ClientService {
get { return LOGGING_DOMAIN; }
}
+ private Quirks quirks;
+
private Nonblocking.Mutex sessions_mutex = new Nonblocking.Mutex();
private Gee.Set<ClientSession> all_sessions =
new Gee.HashSet<ClientSession>();
@@ -112,9 +120,10 @@ public class Geary.Imap.ClientService : Geary.ClientService {
public ClientService(AccountInformation account,
- ServiceInformation service,
+ ServiceInformation configuration,
Endpoint remote) {
- base(account, service, remote);
+ base(account, configuration, remote);
+ this.quirks = new_quirks_for_provider(account.service_provider);
}
/**
@@ -445,7 +454,7 @@ public class Geary.Imap.ClientService : Geary.ClientService {
throw new ImapError.UNAUTHENTICATED("Token not loaded");
}
- ClientSession new_session = new ClientSession(remote);
+ ClientSession new_session = new ClientSession(remote, this.quirks);
new_session.set_logging_parent(this);
yield new_session.connect_async(
ClientSession.DEFAULT_GREETING_TIMEOUT_SEC, cancellable
diff --git a/src/engine/imap/api/imap-quirks.vala b/src/engine/imap/api/imap-quirks.vala
new file mode 100644
index 00000000..cce53d46
--- /dev/null
+++ b/src/engine/imap/api/imap-quirks.vala
@@ -0,0 +1,18 @@
+/*
+ * Copyright © 2019-2020 Michael Gratton <mike vee net>
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+/**
+ * A set of quirks for a specific IMAP service.
+ */
+public class Geary.Imap.Quirks : BaseObject {
+
+
+ /** The set of additional characters allowed in an IMAP flag. */
+ public string? flag_atom_exceptions { get; set; }
+
+
+}
diff --git a/src/engine/imap/transport/imap-client-connection.vala
b/src/engine/imap/transport/imap-client-connection.vala
index ab8f8dc8..756d7bb7 100644
--- a/src/engine/imap/transport/imap-client-connection.vala
+++ b/src/engine/imap/transport/imap-client-connection.vala
@@ -65,6 +65,7 @@ public class Geary.Imap.ClientConnection : BaseObject, Logging.Source {
private Geary.Endpoint endpoint;
private int cx_id;
+ private Quirks quirks;
private IOStream? cx = null;
private Deserializer? deserializer = null;
private Serializer? serializer = null;
@@ -111,9 +112,11 @@ public class Geary.Imap.ClientConnection : BaseObject, Logging.Source {
public ClientConnection(
Geary.Endpoint endpoint,
+ Quirks quirks,
uint command_timeout = Command.DEFAULT_RESPONSE_TIMEOUT_SEC,
uint idle_timeout_sec = DEFAULT_IDLE_TIMEOUT_SEC) {
this.endpoint = endpoint;
+ this.quirks = quirks;
this.cx_id = next_cx_id++;
this.command_timeout = command_timeout;
this.idle_timer = new TimeoutManager.seconds(
@@ -323,7 +326,9 @@ public class Geary.Imap.ClientConnection : BaseObject, Logging.Source {
// Not buffering the Deserializer because it uses a
// DataInputStream, which is already buffered
- this.deserializer = new Deserializer(id, this.cx.input_stream);
+ this.deserializer = new Deserializer(
+ id, this.cx.input_stream, this.quirks
+ );
this.deserializer.bytes_received.connect(on_bytes_received);
this.deserializer.deserialize_failure.connect(on_deserialize_failure);
this.deserializer.end_of_stream.connect(on_eos);
diff --git a/src/engine/imap/transport/imap-client-session.vala
b/src/engine/imap/transport/imap-client-session.vala
index a7c1ae53..13957422 100644
--- a/src/engine/imap/transport/imap-client-session.vala
+++ b/src/engine/imap/transport/imap-client-session.vala
@@ -296,6 +296,7 @@ public class Geary.Imap.ClientSession : BaseObject, Logging.Source {
private Gee.List<Namespace> shared_namespaces = new Gee.ArrayList<Namespace>();
private Endpoint imap_endpoint;
+ private Quirks quirks;
private Geary.State.Machine fsm;
private ClientConnection? cx = null;
@@ -344,8 +345,9 @@ public class Geary.Imap.ClientSession : BaseObject, Logging.Source {
public signal void status(StatusData status_data);
- public ClientSession(Endpoint imap_endpoint) {
+ public ClientSession(Endpoint imap_endpoint, Quirks quirks) {
this.imap_endpoint = imap_endpoint;
+ this.quirks = quirks;
Geary.State.Mapping[] mappings = {
new Geary.State.Mapping(State.NOT_CONNECTED, Event.CONNECT, on_connect),
@@ -774,7 +776,7 @@ public class Geary.Imap.ClientSession : BaseObject, Logging.Source {
MachineParams params = (MachineParams) object;
assert(cx == null);
- cx = new ClientConnection(imap_endpoint);
+ cx = new ClientConnection(imap_endpoint, this.quirks);
cx.set_logging_parent(this);
cx.sent_command.connect(on_network_sent_command);
cx.send_failure.connect(on_network_send_error);
diff --git a/src/engine/imap/transport/imap-deserializer.vala
b/src/engine/imap/transport/imap-deserializer.vala
index 014d73ae..6f0d4b4d 100644
--- a/src/engine/imap/transport/imap-deserializer.vala
+++ b/src/engine/imap/transport/imap-deserializer.vala
@@ -85,6 +85,7 @@ public class Geary.Imap.Deserializer : BaseObject, Logging.Source {
private weak Logging.Source? _logging_parent = null;
private string identifier;
+ private Quirks quirks;
private DataInputStream input;
private Geary.State.Machine fsm;
@@ -153,13 +154,17 @@ public class Geary.Imap.Deserializer : BaseObject, Logging.Source {
public signal void end_of_stream();
- public Deserializer(string identifier, GLib.InputStream input) {
+ public Deserializer(string identifier,
+ GLib.InputStream input,
+ Quirks quirks) {
this.identifier = identifier;
this.input = new GLib.DataInputStream(input);
this.input.set_close_base_stream(false);
this.input.set_newline_type(CR_LF);
+ this.quirks = quirks;
+
Geary.State.Mapping[] mappings = {
new Geary.State.Mapping(State.TAG, Event.CHAR, on_tag_char),
new Geary.State.Mapping(State.TAG, Event.EOS, on_eos),
diff --git a/src/engine/meson.build b/src/engine/meson.build
index d026575d..ee664cf6 100644
--- a/src/engine/meson.build
+++ b/src/engine/meson.build
@@ -93,6 +93,7 @@ geary_engine_vala_sources = files(
'imap/api/imap-folder-properties.vala',
'imap/api/imap-folder-root.vala',
'imap/api/imap-folder-session.vala',
+ 'imap/api/imap-quirks.vala',
'imap/api/imap-session-object.vala',
'imap/command/imap-append-command.vala',
'imap/command/imap-authenticate-command.vala',
diff --git a/test/engine/imap/transport/imap-client-connection-test.vala
b/test/engine/imap/transport/imap-client-connection-test.vala
index cbbf9a78..9bc745da 100644
--- a/test/engine/imap/transport/imap-client-connection-test.vala
+++ b/test/engine/imap/transport/imap-client-connection-test.vala
@@ -38,7 +38,7 @@ class Geary.Imap.ClientConnectionTest : TestCase {
}
public void connect_disconnect() throws GLib.Error {
- var test_article = new ClientConnection(new_endpoint());
+ var test_article = new ClientConnection(new_endpoint(), new Quirks());
test_article.connect_async.begin(null, this.async_completion);
test_article.connect_async.end(async_result());
@@ -69,7 +69,7 @@ class Geary.Imap.ClientConnectionTest : TestCase {
const int IDLE_TIMEOUT = 1;
var test_article = new ClientConnection(
- new_endpoint(), COMMAND_TIMEOUT, IDLE_TIMEOUT
+ new_endpoint(), new Quirks(), COMMAND_TIMEOUT, IDLE_TIMEOUT
);
test_article.connect_async.begin(null, this.async_completion);
test_article.connect_async.end(async_result());
@@ -123,7 +123,9 @@ class Geary.Imap.ClientConnectionTest : TestCase {
bool recv_fail = false;
bool timed_out = false;
- var test_article = new ClientConnection(new_endpoint(), TIMEOUT);
+ var test_article = new ClientConnection(
+ new_endpoint(), new Quirks(), TIMEOUT
+ );
test_article.sent_command.connect(() => { sent = true; });
test_article.receive_failure.connect(() => { recv_fail = true; });
test_article.connect_async.begin(null, this.async_completion);
diff --git a/test/engine/imap/transport/imap-client-session-test.vala
b/test/engine/imap/transport/imap-client-session-test.vala
index 8e2195a8..f1a9e9e5 100644
--- a/test/engine/imap/transport/imap-client-session-test.vala
+++ b/test/engine/imap/transport/imap-client-session-test.vala
@@ -43,7 +43,7 @@ class Geary.Imap.ClientSessionTest : TestCase {
);
this.server.add_script_line(WAIT_FOR_DISCONNECT, "");
- var test_article = new ClientSession(new_endpoint());
+ var test_article = new ClientSession(new_endpoint(), new Quirks());
assert_true(test_article.get_protocol_state() == NOT_CONNECTED);
test_article.connect_async.begin(
@@ -69,7 +69,7 @@ class Geary.Imap.ClientSessionTest : TestCase {
);
this.server.add_script_line(WAIT_FOR_DISCONNECT, "");
- var test_article = new ClientSession(new_endpoint());
+ var test_article = new ClientSession(new_endpoint(), new Quirks());
test_article.connect_async.begin(
CONNECT_TIMEOUT, null, this.async_completion
);
@@ -87,7 +87,7 @@ class Geary.Imap.ClientSessionTest : TestCase {
public void connect_timeout() throws GLib.Error {
this.server.add_script_line(WAIT_FOR_DISCONNECT, "");
- var test_article = new ClientSession(new_endpoint());
+ var test_article = new ClientSession(new_endpoint(), new Quirks());
GLib.Timer timer = new GLib.Timer();
timer.start();
@@ -115,7 +115,7 @@ class Geary.Imap.ClientSessionTest : TestCase {
);
this.server.add_script_line(WAIT_FOR_DISCONNECT, "");
- var test_article = new ClientSession(new_endpoint());
+ var test_article = new ClientSession(new_endpoint(), new Quirks());
test_article.connect_async.begin(
CONNECT_TIMEOUT, null, this.async_completion
);
@@ -147,7 +147,7 @@ class Geary.Imap.ClientSessionTest : TestCase {
this.server.add_script_line(SEND_LINE, "a001 OK ohhai");
this.server.add_script_line(WAIT_FOR_DISCONNECT, "");
- var test_article = new ClientSession(new_endpoint());
+ var test_article = new ClientSession(new_endpoint(), new Quirks());
assert_true(test_article.get_protocol_state() == NOT_CONNECTED);
test_article.connect_async.begin(
@@ -184,7 +184,7 @@ class Geary.Imap.ClientSessionTest : TestCase {
this.server.add_script_line(SEND_LINE, "a001 OK laters");
this.server.add_script_line(DISCONNECT, "");
- var test_article = new ClientSession(new_endpoint());
+ var test_article = new ClientSession(new_endpoint(), new Quirks());
assert_true(test_article.get_protocol_state() == NOT_CONNECTED);
test_article.connect_async.begin(
@@ -215,7 +215,7 @@ class Geary.Imap.ClientSessionTest : TestCase {
this.server.add_script_line(SEND_LINE, "a002 OK laters");
this.server.add_script_line(DISCONNECT, "");
- var test_article = new ClientSession(new_endpoint());
+ var test_article = new ClientSession(new_endpoint(), new Quirks());
assert_true(test_article.get_protocol_state() == NOT_CONNECTED);
test_article.connect_async.begin(
@@ -260,7 +260,7 @@ class Geary.Imap.ClientSessionTest : TestCase {
this.server.add_script_line(SEND_LINE, "a004 OK there");
this.server.add_script_line(WAIT_FOR_DISCONNECT, "");
- var test_article = new ClientSession(new_endpoint());
+ var test_article = new ClientSession(new_endpoint(), new Quirks());
assert_true(test_article.get_protocol_state() == NOT_CONNECTED);
test_article.connect_async.begin(
@@ -304,7 +304,7 @@ class Geary.Imap.ClientSessionTest : TestCase {
this.server.add_script_line(SEND_LINE, "a002 OK there");
this.server.add_script_line(WAIT_FOR_DISCONNECT, "");
- var test_article = new ClientSession(new_endpoint());
+ var test_article = new ClientSession(new_endpoint(), new Quirks());
assert_true(test_article.get_protocol_state() == NOT_CONNECTED);
test_article.connect_async.begin(
@@ -367,7 +367,7 @@ class Geary.Imap.ClientSessionTest : TestCase {
this.server.add_script_line(SEND_LINE, "a003 OK there");
this.server.add_script_line(WAIT_FOR_DISCONNECT, "");
- var test_article = new ClientSession(new_endpoint());
+ var test_article = new ClientSession(new_endpoint(), new Quirks());
assert_true(test_article.get_protocol_state() == NOT_CONNECTED);
test_article.connect_async.begin(
diff --git a/test/engine/imap/transport/imap-deserializer-test.vala
b/test/engine/imap/transport/imap-deserializer-test.vala
index d7380eaa..e9a34d88 100644
--- a/test/engine/imap/transport/imap-deserializer-test.vala
+++ b/test/engine/imap/transport/imap-deserializer-test.vala
@@ -47,7 +47,7 @@ class Geary.Imap.DeserializerTest : TestCase {
public override void set_up() {
this.stream = new MemoryInputStream();
- this.deser = new Deserializer(ID, this.stream);
+ this.deser = new Deserializer(ID, this.stream, new Quirks());
}
public override void tear_down() {
diff --git a/test/integration/imap/client-session.vala b/test/integration/imap/client-session.vala
index d4f1c3d8..ad48e545 100644
--- a/test/integration/imap/client-session.vala
+++ b/test/integration/imap/client-session.vala
@@ -28,7 +28,10 @@ class Integration.Imap.ClientSession : TestCase {
public override void set_up() {
this.session = new Geary.Imap.ClientSession(
- this.config.target
+ this.config.target,
+ Geary.Imap.ClientService.new_quirks_for_provider(
+ this.config.provider
+ )
);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]