aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers/imap
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@ximian.com>2001-08-10 06:48:12 +0800
committerJeffrey Stedfast <fejj@src.gnome.org>2001-08-10 06:48:12 +0800
commita1dbf7e2b8b79455eedec53cc9f2221e97215a9f (patch)
treeb0bf3f378203d7896c2995cabb158814aebbb9cd /camel/providers/imap
parent80f09e4507d10a14a009c882bb0df5ec6e795de7 (diff)
downloadgsoc2013-evolution-a1dbf7e2b8b79455eedec53cc9f2221e97215a9f.tar.gz
gsoc2013-evolution-a1dbf7e2b8b79455eedec53cc9f2221e97215a9f.tar.zst
gsoc2013-evolution-a1dbf7e2b8b79455eedec53cc9f2221e97215a9f.zip
A quoted string cannot contain \n's so check for those as well.
2001-08-09 Jeffrey Stedfast <fejj@ximian.com> * providers/imap/camel-imap-utils.c (imap_parse_string_generic): A quoted string cannot contain \n's so check for those as well. (imap_atom_specials): Update this to fix bug #6553. svn path=/trunk/; revision=11845
Diffstat (limited to 'camel/providers/imap')
-rw-r--r--camel/providers/imap/camel-imap-command.c128
-rw-r--r--camel/providers/imap/camel-imap-store.c56
-rw-r--r--camel/providers/imap/camel-imap-utils.c145
3 files changed, 163 insertions, 166 deletions
diff --git a/camel/providers/imap/camel-imap-command.c b/camel/providers/imap/camel-imap-command.c
index 4c84b47fbb..b5b80624ef 100644
--- a/camel/providers/imap/camel-imap-command.c
+++ b/camel/providers/imap/camel-imap-command.c
@@ -84,9 +84,9 @@ camel_imap_command (CamelImapStore *store, CamelFolder *folder,
{
va_list ap;
char *cmd;
-
+
CAMEL_IMAP_STORE_LOCK (store, command_lock);
-
+
if (fmt) {
va_start (ap, fmt);
cmd = imap_command_strdup_vprintf (store, fmt, ap);
@@ -101,14 +101,14 @@ camel_imap_command (CamelImapStore *store, CamelFolder *folder,
cmd = imap_command_strdup_printf (store, "SELECT %F",
folder->full_name);
}
-
+
if (!imap_command_start (store, folder, cmd, ex)) {
g_free (cmd);
CAMEL_IMAP_STORE_UNLOCK (store, command_lock);
return NULL;
}
g_free (cmd);
-
+
return imap_read_response (store, ex);
}
@@ -152,15 +152,15 @@ camel_imap_command_start (CamelImapStore *store, CamelFolder *folder,
va_list ap;
char *cmd;
gboolean ok;
-
+
va_start (ap, fmt);
cmd = imap_command_strdup_vprintf (store, fmt, ap);
va_end (ap);
-
+
CAMEL_IMAP_STORE_LOCK (store, command_lock);
ok = imap_command_start (store, folder, cmd, ex);
g_free (cmd);
-
+
if (!ok)
CAMEL_IMAP_STORE_UNLOCK (store, command_lock);
return ok;
@@ -174,7 +174,7 @@ imap_command_start (CamelImapStore *store, CamelFolder *folder,
if (folder && folder != store->current_folder) {
CamelImapResponse *response;
CamelException internal_ex;
-
+
response = camel_imap_command (store, folder, ex, NULL);
if (!response)
return NULL;
@@ -186,7 +186,7 @@ imap_command_start (CamelImapStore *store, CamelFolder *folder,
return FALSE;
}
}
-
+
/* Send the command */
return camel_remote_store_send_string (CAMEL_REMOTE_STORE (store), ex,
"%c%.5d %s\r\n",
@@ -218,7 +218,7 @@ camel_imap_command_continuation (CamelImapStore *store, const char *cmd,
CAMEL_IMAP_STORE_UNLOCK (store, command_lock);
return NULL;
}
-
+
return imap_read_response (store, ex);
}
@@ -243,17 +243,17 @@ camel_imap_command_response (CamelImapStore *store, char **response,
{
CamelImapResponseType type;
char *respbuf;
-
+
if (camel_remote_store_recv_line (CAMEL_REMOTE_STORE (store),
&respbuf, ex) < 0) {
CAMEL_IMAP_STORE_UNLOCK (store, command_lock);
return CAMEL_IMAP_RESPONSE_ERROR;
}
-
+
switch (*respbuf) {
case '*':
type = CAMEL_IMAP_RESPONSE_UNTAGGED;
-
+
/* Read the rest of the response if it is multi-line. */
respbuf = imap_read_untagged (store, respbuf, ex);
if (!respbuf)
@@ -273,7 +273,7 @@ camel_imap_command_response (CamelImapStore *store, char **response,
break;
}
*response = respbuf;
-
+
if (type == CAMEL_IMAP_RESPONSE_ERROR ||
type == CAMEL_IMAP_RESPONSE_TAGGED)
CAMEL_IMAP_STORE_UNLOCK (store, command_lock);
@@ -286,39 +286,39 @@ imap_read_response (CamelImapStore *store, CamelException *ex)
CamelImapResponse *response;
CamelImapResponseType type;
char *respbuf, *p;
-
+
/* Get another lock so that when we reach the tagged
* response and camel_imap_command_response unlocks,
* we're still locked. This lock is owned by response
* and gets unlocked when response is freed.
*/
CAMEL_IMAP_STORE_LOCK (store, command_lock);
-
+
response = g_new0 (CamelImapResponse, 1);
if (store->current_folder && camel_disco_store_status (CAMEL_DISCO_STORE (store)) != CAMEL_DISCO_STORE_RESYNCING) {
response->folder = store->current_folder;
camel_object_ref (CAMEL_OBJECT (response->folder));
}
-
+
response->untagged = g_ptr_array_new ();
while ((type = camel_imap_command_response (store, &respbuf, ex))
== CAMEL_IMAP_RESPONSE_UNTAGGED)
g_ptr_array_add (response->untagged, respbuf);
-
+
if (type == CAMEL_IMAP_RESPONSE_ERROR) {
camel_imap_response_free_without_processing (store, response);
return NULL;
}
-
+
response->status = respbuf;
-
+
/* Check for OK or continuation response. */
if (*respbuf == '+')
return response;
p = strchr (respbuf, ' ');
if (p && !g_strncasecmp (p, " OK", 3))
return response;
-
+
/* We should never get BAD, or anything else but +, OK, or NO
* for that matter.
*/
@@ -331,7 +331,7 @@ imap_read_response (CamelImapStore *store, CamelException *ex)
camel_imap_response_free_without_processing (store, response);
return NULL;
}
-
+
p += 3;
if (!*p++)
p = NULL;
@@ -353,29 +353,29 @@ imap_read_untagged (CamelImapStore *store, char *line, CamelException *ex)
GPtrArray *data;
GString *str;
char *end, *p, *s, *d;
-
+
p = strrchr (line, '{');
if (!p)
return line;
-
+
data = g_ptr_array_new ();
fulllen = 0;
-
+
while (1) {
str = g_string_new (line);
g_free (line);
fulllen += str->len;
g_ptr_array_add (data, str);
-
+
p = strrchr (str->str, '{');
if (!p)
break;
-
+
length = strtoul (p + 1, &end, 10);
if (*end != '}' || *(end + 1) || end == p + 1)
break;
ldigits = end - (p + 1);
-
+
/* Read the literal */
str = g_string_sized_new (length + 2);
str->str[0] = '\n';
@@ -397,7 +397,7 @@ imap_read_untagged (CamelImapStore *store, char *line, CamelException *ex)
goto lose;
}
str->str[length + 1] = '\0';
-
+
/* Fix up the literal, turning CRLFs into LF. Also, if
* we find any embedded NULs, strip them. This is
* dubious, but:
@@ -411,7 +411,7 @@ imap_read_untagged (CamelImapStore *store, char *line, CamelException *ex)
* inserts a NUL into the last line when it
* shouldn't.
*/
-
+
s = d = str->str + 1;
end = str->str + 1 + length;
while (s < end) {
@@ -427,7 +427,7 @@ imap_read_untagged (CamelImapStore *store, char *line, CamelException *ex)
}
*d = '\0';
str->len = length + 1;
-
+
/* p points to the "{" in the line that starts the
* literal. The length of the CR-less response must be
* less than or equal to the length of the response
@@ -437,16 +437,16 @@ imap_read_untagged (CamelImapStore *store, char *line, CamelException *ex)
* GString's length would be off...
*/
sprintf (p, "{%0*d}", ldigits, length);
-
+
fulllen += str->len;
g_ptr_array_add (data, str);
-
+
/* Read the next line. */
if (camel_remote_store_recv_line (CAMEL_REMOTE_STORE (store),
&line, ex) < 0)
goto lose;
}
-
+
/* Now reassemble the data. */
p = line = g_malloc (fulllen + 1);
for (i = 0; i < data->len; i++) {
@@ -458,7 +458,7 @@ imap_read_untagged (CamelImapStore *store, char *line, CamelException *ex)
*p = '\0';
g_ptr_array_free (data, TRUE);
return line;
-
+
lose:
for (i = 0; i < data->len; i++)
g_string_free (data->pdata[i], TRUE);
@@ -481,13 +481,13 @@ camel_imap_response_free (CamelImapStore *store, CamelImapResponse *response)
int i, number, exists = 0;
GArray *expunged = NULL;
char *resp, *p;
-
+
if (!response)
return;
-
+
for (i = 0; i < response->untagged->len; i++) {
resp = response->untagged->pdata[i];
-
+
if (response->folder) {
/* Check if it's something we need to handle. */
number = strtoul (resp + 2, &p, 10);
@@ -503,10 +503,10 @@ camel_imap_response_free (CamelImapStore *store, CamelImapResponse *response)
}
g_free (resp);
}
-
+
g_ptr_array_free (response->untagged, TRUE);
g_free (response->status);
-
+
if (response->folder) {
if (exists > 0 || expunged) {
/* Update the summary */
@@ -515,10 +515,10 @@ camel_imap_response_free (CamelImapStore *store, CamelImapResponse *response)
if (expunged)
g_array_free (expunged, TRUE);
}
-
+
camel_object_unref (CAMEL_OBJECT (response->folder));
}
-
+
g_free (response);
CAMEL_IMAP_STORE_UNLOCK (store, command_lock);
}
@@ -565,18 +565,18 @@ camel_imap_response_extract (CamelImapStore *store,
{
int len = strlen (type), i;
char *resp;
-
+
for (i = 0; i < response->untagged->len; i++) {
resp = response->untagged->pdata[i];
/* Skip "* ", and initial sequence number, if present */
strtoul (resp + 2, &resp, 10);
if (*resp == ' ')
resp = imap_next_word (resp);
-
+
if (!g_strncasecmp (resp, type, len))
break;
}
-
+
if (i < response->untagged->len) {
resp = response->untagged->pdata[i];
g_ptr_array_remove_index (response->untagged, i);
@@ -586,7 +586,7 @@ camel_imap_response_extract (CamelImapStore *store,
_("IMAP server response did not contain "
"%s information"), type);
}
-
+
camel_imap_response_free (store, response);
return resp;
}
@@ -610,14 +610,14 @@ camel_imap_response_extract_continuation (CamelImapStore *store,
CamelException *ex)
{
char *status;
-
+
if (response->status && *response->status == '+') {
status = response->status;
response->status = NULL;
camel_imap_response_free (store, response);
return status;
}
-
+
camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
_("Unexpected OK response from IMAP server: %s"),
response->status);
@@ -633,9 +633,9 @@ imap_command_strdup_vprintf (CamelImapStore *store, const char *fmt,
const char *p, *start;
char *out, *op, *string;
int num, len, i, arglen;
-
+
args = g_ptr_array_new ();
-
+
/* Determine the length of the data */
len = strlen (fmt);
p = start = fmt;
@@ -643,7 +643,7 @@ imap_command_strdup_vprintf (CamelImapStore *store, const char *fmt,
p = strchr (start, '%');
if (!p)
break;
-
+
switch (*++p) {
case 'd':
num = va_arg (ap, int);
@@ -651,14 +651,14 @@ imap_command_strdup_vprintf (CamelImapStore *store, const char *fmt,
start = p + 1;
len += 10;
break;
-
+
case 's':
string = va_arg (ap, char *);
g_ptr_array_add (args, string);
start = p + 1;
len += strlen (string);
break;
-
+
case 'S':
case 'F':
string = va_arg (ap, char *);
@@ -672,11 +672,11 @@ imap_command_strdup_vprintf (CamelImapStore *store, const char *fmt,
len += arglen * 2;
start = p + 1;
break;
-
+
case '%':
start = p;
break;
-
+
default:
g_warning ("camel-imap-command is not printf. I don't "
"know what '%%%c' means.", *p);
@@ -684,7 +684,7 @@ imap_command_strdup_vprintf (CamelImapStore *store, const char *fmt,
break;
}
}
-
+
/* Now write out the string */
op = out = g_malloc (len + 1);
p = start = fmt;
@@ -698,18 +698,18 @@ imap_command_strdup_vprintf (CamelImapStore *store, const char *fmt,
strncpy (op, start, p - start);
op += p - start;
}
-
+
switch (*++p) {
case 'd':
num = GPOINTER_TO_INT (args->pdata[i++]);
op += sprintf (op, "%d", num);
break;
-
+
case 's':
string = args->pdata[i++];
op += sprintf (op, "%s", string);
break;
-
+
case 'S':
case 'F':
string = args->pdata[i++];
@@ -726,15 +726,15 @@ imap_command_strdup_vprintf (CamelImapStore *store, const char *fmt,
if (*p == 'F')
g_free (string);
break;
-
+
default:
*op++ = '%';
*op++ = *p;
}
-
+
start = *p ? p + 1 : p;
}
-
+
return out;
}
@@ -743,10 +743,10 @@ imap_command_strdup_printf (CamelImapStore *store, const char *fmt, ...)
{
va_list ap;
char *result;
-
+
va_start (ap, fmt);
result = imap_command_strdup_vprintf (store, fmt, ap);
va_end (ap);
-
+
return result;
}
diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c
index b1baaf718f..9eff81ecf3 100644
--- a/camel/providers/imap/camel-imap-store.c
+++ b/camel/providers/imap/camel-imap-store.c
@@ -617,7 +617,7 @@ imap_connect_online (CamelService *service, CamelException *ex)
}
if (!store->namespace)
store->namespace = g_strdup ("");
-
+
if (!store->dir_sep) {
if (store->server_level >= IMAP_LEVEL_IMAP4REV1) {
/* This idiom means "tell me the hierarchy separator
@@ -637,7 +637,7 @@ imap_connect_online (CamelService *service, CamelException *ex)
}
if (!response)
goto done;
-
+
result = camel_imap_response_extract (store, response, "LIST", NULL);
if (result) {
imap_parse_list_response (store, result, NULL, &store->dir_sep, NULL);
@@ -646,7 +646,7 @@ imap_connect_online (CamelService *service, CamelException *ex)
if (!store->dir_sep)
store->dir_sep = '/'; /* Guess */
}
-
+
/* Write namespace/separator out */
camel_file_util_encode_string (storeinfo, store->namespace);
camel_file_util_encode_uint32 (storeinfo, store->dir_sep);
@@ -983,20 +983,20 @@ create_folder (CamelStore *store, const char *parent_name,
char *full_name, *resp, *thisone;
gboolean need_convert;
int i, flags;
-
+
if (!camel_disco_store_check_online (CAMEL_DISCO_STORE (store), ex))
return NULL;
if (!parent_name)
parent_name = "";
-
+
/* check if the parent allows inferiors */
-
+
need_convert = FALSE;
response = camel_imap_command (imap_store, NULL, ex, "LIST \"\" %F",
parent_name);
if (!response) /* whoa, this is bad */
return NULL;
-
+
/* FIXME: does not handle unexpected circumstances very well */
for (i = 0; i < response->untagged->len; i++) {
resp = response->untagged->pdata[i];
@@ -1012,18 +1012,18 @@ create_folder (CamelStore *store, const char *parent_name,
}
camel_imap_response_free (imap_store, response);
-
+
/* if not, check if we can delete it and recreate it */
if (need_convert) {
gchar *name;
CamelException internal_ex;
-
+
if (get_folder_status (imap_store, parent_name, "MESSAGES")) {
camel_exception_set (ex, CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
_("The parent folder is not allowed to contain subfolders"));
return NULL;
}
-
+
/* delete the old parent and recreate it */
camel_exception_init (&internal_ex);
delete_folder (store, parent_name, &internal_ex);
@@ -1031,22 +1031,21 @@ create_folder (CamelStore *store, const char *parent_name,
camel_exception_xfer (ex, &internal_ex);
return NULL;
}
-
+
/* add the dirsep to the end of parent_name */
name = g_strdup_printf ("%s%c", parent_name, imap_store->dir_sep);
response = camel_imap_command (imap_store, NULL, ex, "CREATE %F",
name);
g_free (name);
-
+
if (!response)
return NULL;
else
camel_imap_response_free (imap_store, response);
}
-
/* ok now we can create the folder */
-
+
full_name = imap_concat (imap_store, parent_name, folder_name);
response = camel_imap_command (imap_store, NULL, ex, "CREATE %F",
full_name);
@@ -1055,7 +1054,7 @@ create_folder (CamelStore *store, const char *parent_name,
fi = get_folder_info_online (store, full_name, 0, ex);
} else
fi = NULL;
-
+
g_free (full_name);
return fi;
}
@@ -1068,10 +1067,10 @@ parse_list_response_as_folder_info (CamelImapStore *imap_store,
int flags;
char sep, *dir, *name = NULL;
CamelURL *url;
-
+
if (!imap_parse_list_response (imap_store, response, &flags, &sep, &dir))
return NULL;
-
+
if (sep) {
name = strrchr (dir, sep);
if (name && !*++name) {
@@ -1079,14 +1078,14 @@ parse_list_response_as_folder_info (CamelImapStore *imap_store,
return NULL;
}
}
-
+
fi = g_new0 (CamelFolderInfo, 1);
fi->full_name = dir;
if (sep && name)
fi->name = g_strdup (name);
else
fi->name = g_strdup (dir);
-
+
url = camel_url_new (imap_store->base_url, NULL);
g_free (url->path);
url->path = g_strdup_printf ("/%s", dir);
@@ -1094,11 +1093,10 @@ parse_list_response_as_folder_info (CamelImapStore *imap_store,
camel_url_set_param (url, "noselect", "yes");
fi->url = camel_url_to_string (url, 0);
camel_url_free (url);
-
-
+
if (!(flags & IMAP_LIST_FLAG_UNMARKED))
fi->unread_message_count = -1;
-
+
return fi;
}
@@ -1117,11 +1115,11 @@ get_subscribed_folders_by_hand (CamelImapStore *imap_store, const char *top,
CamelFolderInfo *fi;
char *result;
int i, toplen = strlen (top);
-
+
names = g_ptr_array_new ();
g_hash_table_foreach (imap_store->subscribed_folders,
copy_folder_name, names);
-
+
for (i = 0; i < names->len; i++) {
response = camel_imap_command (imap_store, NULL, ex,
"LIST \"\" %F",
@@ -1138,16 +1136,16 @@ get_subscribed_folders_by_hand (CamelImapStore *imap_store, const char *top,
g_ptr_array_remove_index_fast (names, i--);
continue;
}
-
+
fi = parse_list_response_as_folder_info (imap_store, result);
if (!fi)
continue;
-
+
if (strncmp (top, fi->full_name, toplen) != 0) {
camel_folder_info_free (fi);
continue;
}
-
+
g_ptr_array_add (folders, fi);
}
g_ptr_array_free (names, TRUE);
@@ -1161,13 +1159,13 @@ get_folders_online (CamelImapStore *imap_store, const char *pattern,
CamelFolderInfo *fi;
char *list;
int i;
-
+
response = camel_imap_command (imap_store, NULL, ex,
"%s \"\" %F", lsub ? "LSUB" : "LIST",
pattern);
if (!response)
return;
-
+
for (i = 0; i < response->untagged->len; i++) {
list = response->untagged->pdata[i];
fi = parse_list_response_as_folder_info (imap_store, list);
diff --git a/camel/providers/imap/camel-imap-utils.c b/camel/providers/imap/camel-imap-utils.c
index 944165aebb..648712a6ad 100644
--- a/camel/providers/imap/camel-imap-utils.c
+++ b/camel/providers/imap/camel-imap-utils.c
@@ -64,41 +64,41 @@ imap_parse_list_response (CamelImapStore *store, const char *buf, int *flags, ch
{
char *word;
int len;
-
+
if (*buf != '*')
return FALSE;
-
+
word = imap_next_word (buf);
if (g_strncasecmp (word, "LIST", 4) && g_strncasecmp (word, "LSUB", 4))
return FALSE;
-
+
/* get the flags */
word = imap_next_word (word);
if (*word != '(')
return FALSE;
-
+
if (flags)
*flags = 0;
-
+
word++;
while (*word != ')') {
len = strcspn (word, " )");
if (flags) {
- if (!g_strncasecmp (word, "\\Noinferiors", len))
+ if (!g_strncasecmp (word, "\\NoInferiors", len))
*flags |= IMAP_LIST_FLAG_NOINFERIORS;
- else if (!g_strncasecmp (word, "\\Noselect", len))
+ else if (!g_strncasecmp (word, "\\NoSelect", len))
*flags |= IMAP_LIST_FLAG_NOSELECT;
else if (!g_strncasecmp (word, "\\Marked", len))
*flags |= IMAP_LIST_FLAG_MARKED;
else if (!g_strncasecmp (word, "\\Unmarked", len))
*flags |= IMAP_LIST_FLAG_UNMARKED;
}
-
+
word += len;
while (*word == ' ')
word++;
}
-
+
/* get the directory separator */
word = imap_next_word (word);
if (!strncmp (word, "NIL", 3)) {
@@ -114,11 +114,11 @@ imap_parse_list_response (CamelImapStore *store, const char *buf, int *flags, ch
return FALSE;
} else
return FALSE;
-
+
if (folder) {
char *real_name;
int n_len;
-
+
/* get the folder name */
word = imap_next_word (word);
real_name = imap_parse_astring (&word, &len);
@@ -134,7 +134,7 @@ imap_parse_list_response (CamelImapStore *store, const char *buf, int *flags, ch
g_free (real_name);
return *folder != NULL;
}
-
+
return TRUE;
}
@@ -198,25 +198,25 @@ imap_parse_flag_list (char **flag_list_p)
if (*flag_list == ' ')
flag_list++;
}
-
+
if (*flag_list++ != ')') {
*flag_list_p = NULL;
return 0;
}
-
+
*flag_list_p = flag_list;
return flags;
}
static char imap_atom_specials[128] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
};
#define imap_is_atom_char(ch) (isprint (ch) && !imap_atom_specials[ch])
@@ -246,18 +246,19 @@ imap_parse_string_generic (char **str_p, int *len, int type)
{
char *str = *str_p;
char *out;
-
+
if (!str)
return NULL;
else if (*str == '"') {
char *p;
int size;
-
+
str++;
size = strcspn (str, "\"") + 1;
p = out = g_malloc (size);
-
- while (*str && *str != '"') {
+
+ /* a quoted string cannot be broken into multiple lines */
+ while (*str && *str != '"' && *str != '\n') {
if (*str == '\\')
str++;
*p++ = *str++;
@@ -290,11 +291,10 @@ imap_parse_string_generic (char **str_p, int *len, int type)
*str_p += 3;
*len = 0;
return NULL;
- } else if (type == IMAP_ASTRING &&
- imap_is_atom_char ((unsigned char)*str)) {
+ } else if (type == IMAP_ASTRING && imap_is_atom_char ((unsigned char)*str)) {
while (imap_is_atom_char ((unsigned char)*str))
str++;
-
+
*len = str - *str_p;
str = g_strndup (*str_p, *len);
*str_p += *len;
@@ -319,7 +319,7 @@ static void
skip_asn (char **str_p)
{
char *str = *str_p;
-
+
if (!str)
return;
else if (*str == '"') {
@@ -336,7 +336,7 @@ skip_asn (char **str_p)
*str_p = NULL;
} else if (*str == '{') {
unsigned long len;
-
+
len = strtoul (str + 1, &str, 10);
if (*str != '}' || *(str + 1) != '\n' ||
strlen (str + 2) < len) {
@@ -374,31 +374,31 @@ parse_params (char **parms_p, CamelContentType *type)
{
char *parms = *parms_p, *name, *value;
int len;
-
+
if (!g_strncasecmp (parms, "nil", 3)) {
*parms_p += 3;
return;
}
-
+
if (*parms++ != '(') {
*parms_p = NULL;
return;
}
-
+
while (parms && *parms != ')') {
name = imap_parse_nstring (&parms, &len);
skip_char (&parms, ' ');
value = imap_parse_nstring (&parms, &len);
-
+
if (name && value)
header_content_type_set_param (type, name, value);
g_free (name);
g_free (value);
-
+
if (parms && *parms == ' ')
parms++;
}
-
+
if (!parms || *parms++ != ')') {
*parms_p = NULL;
return;
@@ -424,18 +424,18 @@ imap_parse_body (char **body_p, CamelFolder *folder,
CamelMessageContentInfo *child;
CamelContentType *type;
int len;
-
+
if (*body++ != '(') {
*body_p = NULL;
return;
}
-
+
if (*body == '(') {
/* multipart */
GPtrArray *children;
char *subtype;
int i;
-
+
/* Parse the child body parts */
children = g_ptr_array_new ();
i = 0;
@@ -448,10 +448,10 @@ imap_parse_body (char **body_p, CamelFolder *folder,
child->parent = ci;
}
skip_char (&body, ' ');
-
+
/* Parse the multipart subtype */
subtype = imap_parse_string (&body, &len);
-
+
/* If there is a parse error, abort. */
if (!body) {
for (i = 0; i < children->len; i++) {
@@ -462,11 +462,11 @@ imap_parse_body (char **body_p, CamelFolder *folder,
*body_p = NULL;
return;
}
-
+
g_strdown (subtype);
ci->type = header_content_type_new ("multipart", subtype);
g_free (subtype);
-
+
/* Chain the children. */
ci->childs = children->pdata[0];
ci->size = 0;
@@ -481,7 +481,7 @@ imap_parse_body (char **body_p, CamelFolder *folder,
char *main_type, *subtype;
char *id, *description, *encoding;
guint32 size;
-
+
main_type = imap_parse_string (&body, &len);
skip_char (&body, ' ');
subtype = imap_parse_string (&body, &len);
@@ -499,7 +499,7 @@ imap_parse_body (char **body_p, CamelFolder *folder,
g_free (subtype);
parse_params (&body, type);
skip_char (&body, ' ');
-
+
id = imap_parse_nstring (&body, &len);
skip_char (&body, ' ');
description = imap_parse_nstring (&body, &len);
@@ -508,7 +508,7 @@ imap_parse_body (char **body_p, CamelFolder *folder,
skip_char (&body, ' ');
if (body)
size = strtoul (body, &body, 10);
-
+
child = NULL;
if (header_content_type_is (type, "message", "rfc822")) {
skip_char (&body, ' ');
@@ -525,7 +525,7 @@ imap_parse_body (char **body_p, CamelFolder *folder,
if (body)
strtoul (body, &body, 10);
}
-
+
if (body) {
ci->type = type;
ci->id = id;
@@ -540,12 +540,12 @@ imap_parse_body (char **body_p, CamelFolder *folder,
g_free (encoding);
}
}
-
+
if (!body || *body++ != ')') {
*body_p = NULL;
return;
}
-
+
*body_p = body;
}
@@ -562,14 +562,14 @@ imap_quote_string (const char *str)
const char *p;
char *quoted, *q;
int len;
-
+
len = strlen (str);
p = str;
while ((p = strpbrk (p, "\"\\"))) {
len++;
p++;
}
-
+
quoted = q = g_malloc (len + 3);
*q++ = '"';
while ((p = strpbrk (str, "\"\\"))) {
@@ -580,7 +580,7 @@ imap_quote_string (const char *str)
str = p;
}
sprintf (q, "%s\"", str);
-
+
return quoted;
}
@@ -590,7 +590,7 @@ get_summary_uid_numeric (CamelFolderSummary *summary, int index)
{
CamelMessageInfo *info;
unsigned long uid;
-
+
info = camel_folder_summary_index (summary, index);
uid = strtoul (camel_message_info_uid (info), NULL, 10);
camel_folder_summary_info_free (summary, info);
@@ -616,14 +616,14 @@ imap_uid_array_to_set (CamelFolderSummary *summary, GPtrArray *uids)
gboolean range = FALSE;
GString *gset;
char *set;
-
+
g_return_val_if_fail (uids->len > 0, NULL);
-
+
gset = g_string_new (uids->pdata[0]);
last_uid = strtoul (uids->pdata[0], NULL, 10);
next_summary_uid = 0;
scount = camel_folder_summary_count (summary);
-
+
for (ui = 1, si = 0; ui < uids->len; ui++) {
/* Find the next UID in the summary after the one we
* just wrote out.
@@ -632,7 +632,7 @@ imap_uid_array_to_set (CamelFolderSummary *summary, GPtrArray *uids)
next_summary_uid = get_summary_uid_numeric (summary, si);
if (last_uid >= next_summary_uid)
next_summary_uid = (unsigned long) -1;
-
+
/* Now get the next UID from @uids */
this_uid = strtoul (uids->pdata[ui], NULL, 10);
if (this_uid == next_summary_uid || this_uid == last_uid + 1)
@@ -644,16 +644,16 @@ imap_uid_array_to_set (CamelFolderSummary *summary, GPtrArray *uids)
}
g_string_sprintfa (gset, ",%lu", this_uid);
}
-
+
last_uid = this_uid;
}
-
+
if (range)
g_string_sprintfa (gset, ":%lu", last_uid);
-
+
set = gset->str;
g_string_free (gset, FALSE);
-
+
return set;
}
@@ -680,10 +680,10 @@ imap_uid_set_to_array (CamelFolderSummary *summary, const char *uids)
char *p, *q;
unsigned long uid, suid;
int si, scount;
-
+
arr = g_ptr_array_new ();
scount = camel_folder_summary_count (summary);
-
+
p = (char *)uids;
si = 0;
do {
@@ -691,7 +691,7 @@ imap_uid_set_to_array (CamelFolderSummary *summary, const char *uids)
if (p == q)
goto lose;
g_ptr_array_add (arr, g_strndup (p, q - p));
-
+
if (*q == ':') {
/* Find the summary entry for the UID after the one
* we just saw.
@@ -703,11 +703,11 @@ imap_uid_set_to_array (CamelFolderSummary *summary, const char *uids)
}
if (si >= scount)
suid = uid + 1;
-
+
uid = strtoul (q + 1, &p, 10);
if (p == q + 1)
goto lose;
-
+
/* Add each summary UID until we find one
* larger than the end of the range
*/
@@ -721,9 +721,9 @@ imap_uid_set_to_array (CamelFolderSummary *summary, const char *uids)
} else
p = q;
} while (*p++ == ',');
-
+
return arr;
-
+
lose:
g_warning ("Invalid uid set %s", uids);
imap_uid_array_free (arr);
@@ -740,7 +740,7 @@ void
imap_uid_array_free (GPtrArray *arr)
{
int i;
-
+
for (i = 0; i < arr->len; i++)
g_free (arr->pdata[i]);
g_ptr_array_free (arr, TRUE);
@@ -763,10 +763,9 @@ imap_namespace_concat (CamelImapStore *store, const char *name)
{
if (!name || *name == '\0')
return g_strdup (store->namespace);
-
+
if (!g_strcasecmp (name, "INBOX"))
return g_strdup ("INBOX");
-
+
return imap_concat (store, store->namespace, name);
}
-