|
|
|
@ -331,44 +331,61 @@ struct mailimap_search_key * mailimap_search_key_new_modseq(struct mailimap_flag
|
|
|
|
|
return key;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int mailimap_search_modseq(mailimap * session, const char * charset,
|
|
|
|
|
struct mailimap_search_key * key, clist ** result, uint64_t * p_mod_sequence_value)
|
|
|
|
|
static int search_modseq(mailimap * session, const char * charset,
|
|
|
|
|
struct mailimap_search_key * key,
|
|
|
|
|
int uid_enabled, int literalplus_enabled,
|
|
|
|
|
clist ** result, uint64_t * p_mod_sequence_value)
|
|
|
|
|
{
|
|
|
|
|
struct mailimap_response * response;
|
|
|
|
|
int r;
|
|
|
|
|
int error_code;
|
|
|
|
|
struct mailimap_condstore_search * search_data;
|
|
|
|
|
clistiter * cur;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (session->imap_state != MAILIMAP_STATE_SELECTED)
|
|
|
|
|
return MAILIMAP_ERROR_BAD_STATE;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r = mailimap_send_current_tag(session);
|
|
|
|
|
if (r != MAILIMAP_NO_ERROR)
|
|
|
|
|
return r;
|
|
|
|
|
|
|
|
|
|
r = mailimap_search_send(session->imap_stream, charset, key);
|
|
|
|
|
|
|
|
|
|
if (literalplus_enabled) {
|
|
|
|
|
if (uid_enabled) {
|
|
|
|
|
r = mailimap_uid_search_literalplus_send(session->imap_stream, charset, key);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
r = mailimap_search_literalplus_send(session->imap_stream, charset, key);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (uid_enabled) {
|
|
|
|
|
r = mailimap_uid_search_send(session->imap_stream, charset, key);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
r = mailimap_search_send(session->imap_stream, charset, key);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (r != MAILIMAP_NO_ERROR)
|
|
|
|
|
return r;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r = mailimap_crlf_send(session->imap_stream);
|
|
|
|
|
if (r != MAILIMAP_NO_ERROR)
|
|
|
|
|
return r;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mailstream_flush(session->imap_stream) == -1)
|
|
|
|
|
return MAILIMAP_ERROR_STREAM;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mailimap_read_line(session) == NULL)
|
|
|
|
|
return MAILIMAP_ERROR_STREAM;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r = mailimap_parse_response(session, &response);
|
|
|
|
|
if (r != MAILIMAP_NO_ERROR)
|
|
|
|
|
return r;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
search_data = NULL;
|
|
|
|
|
for(cur = clist_begin(session->imap_response_info->rsp_extension_list) ; cur != NULL ; cur = clist_next(cur)) {
|
|
|
|
|
struct mailimap_extension_data * ext_data;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ext_data = clist_content(cur);
|
|
|
|
|
if (ext_data->ext_extension->ext_id != MAILIMAP_EXTENSION_CONDSTORE) {
|
|
|
|
|
continue;
|
|
|
|
@ -376,12 +393,12 @@ int mailimap_search_modseq(mailimap * session, const char * charset,
|
|
|
|
|
if (ext_data->ext_type != MAILIMAP_CONDSTORE_TYPE_SEARCH_DATA) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
search_data = ext_data->ext_data;
|
|
|
|
|
ext_data->ext_data = NULL;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (search_data == NULL) {
|
|
|
|
|
* result = session->imap_response_info->rsp_search_result;
|
|
|
|
|
if (p_mod_sequence_value != NULL) {
|
|
|
|
@ -395,98 +412,49 @@ int mailimap_search_modseq(mailimap * session, const char * charset,
|
|
|
|
|
search_data->cs_search_result = NULL;
|
|
|
|
|
mailimap_condstore_search_free(search_data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
error_code = response->rsp_resp_done->rsp_data.rsp_tagged->rsp_cond_state->rsp_type;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mailimap_response_free(response);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch (error_code) {
|
|
|
|
|
case MAILIMAP_RESP_COND_STATE_OK:
|
|
|
|
|
return MAILIMAP_NO_ERROR;
|
|
|
|
|
|
|
|
|
|
return MAILIMAP_NO_ERROR;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
return MAILIMAP_ERROR_SEARCH;
|
|
|
|
|
if (uid_enabled) {
|
|
|
|
|
return MAILIMAP_ERROR_UID_SEARCH;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
return MAILIMAP_ERROR_SEARCH;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int mailimap_uid_search_modseq(mailimap * session, const char * charset,
|
|
|
|
|
int mailimap_search_modseq(mailimap * session, const char * charset,
|
|
|
|
|
struct mailimap_search_key * key, clist ** result, uint64_t * p_mod_sequence_value)
|
|
|
|
|
{
|
|
|
|
|
struct mailimap_response * response;
|
|
|
|
|
int r;
|
|
|
|
|
int error_code;
|
|
|
|
|
struct mailimap_condstore_search * search_data;
|
|
|
|
|
clistiter * cur;
|
|
|
|
|
|
|
|
|
|
if (session->imap_state != MAILIMAP_STATE_SELECTED)
|
|
|
|
|
return MAILIMAP_ERROR_BAD_STATE;
|
|
|
|
|
|
|
|
|
|
r = mailimap_send_current_tag(session);
|
|
|
|
|
if (r != MAILIMAP_NO_ERROR)
|
|
|
|
|
return r;
|
|
|
|
|
|
|
|
|
|
r = mailimap_uid_search_send(session->imap_stream, charset, key);
|
|
|
|
|
if (r != MAILIMAP_NO_ERROR)
|
|
|
|
|
return r;
|
|
|
|
|
|
|
|
|
|
r = mailimap_crlf_send(session->imap_stream);
|
|
|
|
|
if (r != MAILIMAP_NO_ERROR)
|
|
|
|
|
return r;
|
|
|
|
|
|
|
|
|
|
if (mailstream_flush(session->imap_stream) == -1)
|
|
|
|
|
return MAILIMAP_ERROR_STREAM;
|
|
|
|
|
|
|
|
|
|
if (mailimap_read_line(session) == NULL)
|
|
|
|
|
return MAILIMAP_ERROR_STREAM;
|
|
|
|
|
|
|
|
|
|
r = mailimap_parse_response(session, &response);
|
|
|
|
|
if (r != MAILIMAP_NO_ERROR)
|
|
|
|
|
return r;
|
|
|
|
|
|
|
|
|
|
search_data = NULL;
|
|
|
|
|
for(cur = clist_begin(session->imap_response_info->rsp_extension_list) ; cur != NULL ; cur = clist_next(cur)) {
|
|
|
|
|
struct mailimap_extension_data * ext_data;
|
|
|
|
|
|
|
|
|
|
ext_data = clist_content(cur);
|
|
|
|
|
if (ext_data->ext_extension->ext_id != MAILIMAP_EXTENSION_CONDSTORE) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (ext_data->ext_type != MAILIMAP_CONDSTORE_TYPE_SEARCH_DATA) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
search_data = ext_data->ext_data;
|
|
|
|
|
ext_data->ext_data = NULL;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (search_data == NULL) {
|
|
|
|
|
* result = session->imap_response_info->rsp_search_result;
|
|
|
|
|
if (p_mod_sequence_value != NULL) {
|
|
|
|
|
* p_mod_sequence_value = 0;
|
|
|
|
|
}
|
|
|
|
|
session->imap_response_info->rsp_search_result = NULL;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
* result = search_data->cs_search_result;
|
|
|
|
|
if (p_mod_sequence_value != NULL) {
|
|
|
|
|
* p_mod_sequence_value = search_data->cs_modseq_value;
|
|
|
|
|
}
|
|
|
|
|
search_data->cs_search_result = NULL;
|
|
|
|
|
mailimap_condstore_search_free(search_data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
error_code = response->rsp_resp_done->rsp_data.rsp_tagged->rsp_cond_state->rsp_type;
|
|
|
|
|
return search_modseq(session, charset, key, 0, 0, result, p_mod_sequence_value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mailimap_response_free(response);
|
|
|
|
|
int mailimap_uid_search_modseq(mailimap * session, const char * charset,
|
|
|
|
|
struct mailimap_search_key * key, clist ** result, uint64_t * p_mod_sequence_value)
|
|
|
|
|
{
|
|
|
|
|
return search_modseq(session, charset, key, 1, 0, result, p_mod_sequence_value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch (error_code) {
|
|
|
|
|
case MAILIMAP_RESP_COND_STATE_OK:
|
|
|
|
|
return MAILIMAP_NO_ERROR;
|
|
|
|
|
LIBETPAN_EXPORT
|
|
|
|
|
int mailimap_search_literalplus_modseq(mailimap * session, const char * charset,
|
|
|
|
|
struct mailimap_search_key * key, clist ** result, uint64_t * p_mod_sequence_value)
|
|
|
|
|
{
|
|
|
|
|
return search_modseq(session, charset, key, 0, 1, result, p_mod_sequence_value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
return MAILIMAP_ERROR_UID_SEARCH;
|
|
|
|
|
}
|
|
|
|
|
LIBETPAN_EXPORT
|
|
|
|
|
int mailimap_uid_search_literalplus_modseq(mailimap * session, const char * charset,
|
|
|
|
|
struct mailimap_search_key * key, clist ** result, uint64_t * p_mod_sequence_value)
|
|
|
|
|
{
|
|
|
|
|
return search_modseq(session, charset, key, 1, 1, result, p_mod_sequence_value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int mailimap_select_condstore(mailimap * session, const char * mb, uint64_t * p_mod_sequence_value)
|
|
|
|
|