7
7
public class Geary.Imap.ClientSessionManager {
8
public const int DEFAULT_MIN_POOL_SIZE = 2;
8
public const int DEFAULT_MIN_POOL_SIZE = 4;
10
private AccountSettings settings;
10
private AccountInformation account_information;
11
11
private int min_pool_size;
12
12
private Gee.HashSet<ClientSession> sessions = new Gee.HashSet<ClientSession>();
13
13
private Geary.NonblockingMutex sessions_mutex = new Geary.NonblockingMutex();
21
21
public signal void login_failed();
23
public ClientSessionManager(AccountSettings settings, int min_pool_size = DEFAULT_MIN_POOL_SIZE) {
24
this.settings = settings;
23
public ClientSessionManager(AccountInformation account_information,
24
int min_pool_size = DEFAULT_MIN_POOL_SIZE) {
25
this.account_information = account_information;
25
26
this.min_pool_size = min_pool_size;
28
account_information.notify["imap-credentials"].connect(on_imap_credentials_notified);
30
adjust_session_pool.begin();
33
~ClientSessionManager() {
34
account_information.notify["imap-credentials"].disconnect(on_imap_credentials_notified);
37
private void on_imap_credentials_notified() {
38
authentication_failed = false;
27
39
adjust_session_pool.begin();
44
56
yield create_new_authorized_session(null);
45
57
} catch (Error err) {
46
debug("Unable to create authorized session to %s: %s", settings.imap_endpoint.to_string(), err.message);
58
debug("Unable to create authorized session to %s: %s",
59
account_information.get_imap_endpoint().to_string(), err.message);
93
106
ClientSession session = yield get_authorized_session_async(cancellable);
95
108
ListResults results = ListResults.decode(yield session.send_command_async(
96
new ListCommand.wildcarded("", "%", session.get_capabilities().has_capability("XLIST")),
109
new ListCommand.wildcarded("", new Geary.Imap.MailboxParameter("%"),
110
session.get_capabilities().has_capability("XLIST")),
99
113
if (results.status_response.status != Status.OK)
111
125
ClientSession session = yield get_authorized_session_async(cancellable);
113
127
ListResults results = ListResults.decode(yield session.send_command_async(
114
new ListCommand(specifier, session.get_capabilities().has_capability("XLIST")),
128
new ListCommand(new Geary.Imap.MailboxParameter(specifier),
129
session.get_capabilities().has_capability("XLIST")),
117
132
if (results.status_response.status != Status.OK)
124
139
ClientSession session = yield get_authorized_session_async(cancellable);
126
141
ListResults results = ListResults.decode(yield session.send_command_async(
127
new ListCommand(path, session.get_capabilities().has_capability("XLIST")),
142
new ListCommand(new Geary.Imap.MailboxParameter(path),
143
session.get_capabilities().has_capability("XLIST")),
130
146
return (results.status_response.status == Status.OK) && (results.get_count() == 1);
135
151
ClientSession session = yield get_authorized_session_async(cancellable);
137
153
ListResults results = ListResults.decode(yield session.send_command_async(
138
new ListCommand(path, session.get_capabilities().has_capability("XLIST")),
154
new ListCommand(new Geary.Imap.MailboxParameter(path),
155
session.get_capabilities().has_capability("XLIST")),
141
158
if (results.status_response.status != Status.OK)
149
166
ClientSession session = yield get_authorized_session_async(cancellable);
151
168
StatusResults results = StatusResults.decode(yield session.send_command_async(
152
new StatusCommand(path, types), cancellable));
169
new StatusCommand(new Geary.Imap.MailboxParameter(path), types), cancellable));
154
171
if (results.status_response.status != Status.OK)
155
172
throw new ImapError.SERVER_ERROR("Server error: %s", results.to_string());
160
public async Mailbox select_mailbox(string path, Cancellable? cancellable = null) throws Error {
161
return yield select_examine_mailbox(path, true, cancellable);
164
public async Mailbox examine_mailbox(string path, Cancellable? cancellable = null) throws Error {
165
return yield select_examine_mailbox(path, false, cancellable);
168
public async Mailbox select_examine_mailbox(string path, bool is_select,
169
Cancellable? cancellable = null) throws Error {
177
public async Mailbox select_mailbox(Geary.FolderPath path, string? delim,
178
Cancellable? cancellable = null) throws Error {
179
return yield select_examine_mailbox(path, delim, true, cancellable);
182
public async Mailbox examine_mailbox(Geary.FolderPath path, string? delim,
183
Cancellable? cancellable = null) throws Error {
184
return yield select_examine_mailbox(path, delim, false, cancellable);
187
public async Mailbox select_examine_mailbox(Geary.FolderPath path, string? delim,
188
bool is_select, Cancellable? cancellable = null) throws Error {
170
189
Gee.HashSet<SelectedContext> contexts = is_select ? selected_contexts : examined_contexts;
171
SelectedContext new_context = yield select_examine_async(path, is_select, cancellable);
190
SelectedContext new_context = yield select_examine_async(
191
path.get_fullpath(delim), is_select, cancellable);
173
193
if (!contexts.contains(new_context)) {
174
194
// Can't use the ternary operator due to this bug:
222
242
if (authentication_failed)
223
243
throw new ImapError.UNAUTHENTICATED("Invalid ClientSessionManager credentials");
225
ClientSession new_session = new ClientSession(settings.imap_endpoint, settings.imap_server_pipeline);
245
ClientSession new_session = new ClientSession(account_information.get_imap_endpoint(),
246
account_information.imap_server_pipeline);
227
248
// add session to pool before launching all the connect activity so error cases can properly
243
yield new_session.initiate_session_async(settings.imap_credentials, cancellable);
264
yield new_session.initiate_session_async(account_information.imap_credentials, cancellable);
244
265
} catch (Error err) {
245
266
debug("[%s] Initiate session failure: %s", new_session.to_string(), err.message);