366
/* TODO: this api needs some more work */
367
CamelImapStoreNamespace *camel_imap_store_summary_namespace_new(CamelImapStoreSummary *s, const gchar *full_name, gchar dir_sep)
364
static CamelImapStoreNamespace *
365
namespace_new (CamelImapStoreSummary *s, const gchar *full_name, gchar dir_sep)
369
367
CamelImapStoreNamespace *ns;
393
void camel_imap_store_summary_namespace_set(CamelImapStoreSummary *s, CamelImapStoreNamespace *ns)
395
d(printf("Setting namesapce to '%s' '%c' -> '%s'\n", ns->full_name, ns->sep, ns->path));
396
namespace_clear((CamelStoreSummary *)s);
398
camel_store_summary_touch((CamelStoreSummary *)s);
391
static CamelImapStoreNamespace *
392
namespace_find (CamelImapStoreNamespace *ns, const gchar *full_name, gchar dir_sep)
394
if (!ns || !full_name)
398
gint len = strlen (ns->full_name);
400
if ((g_ascii_strcasecmp (ns->full_name, full_name) == 0 ||
401
(g_ascii_strncasecmp (ns->full_name, full_name, len) == 0
402
&& len + 1 == strlen (full_name) && full_name [len] == ns->sep))&& (!dir_sep || ns->sep == dir_sep)) {
412
camel_imap_store_summary_namespace_set_main (CamelImapStoreSummary *s, const gchar *full_name, gchar dir_sep)
414
CamelImapStoreNamespace *ns;
416
g_return_if_fail (s != NULL);
417
g_return_if_fail (full_name != NULL);
419
ns = namespace_find (s->namespace, full_name, dir_sep);
422
/* is in the list of known namespaces already */
423
if (ns != s->namespace) {
424
CamelImapStoreNamespace *prev = s->namespace;
426
while (prev && prev->next != ns)
429
g_return_if_fail (prev != NULL);
431
/* move it to the first */
432
prev->next = ns->next;
433
ns->next = s->namespace;
436
/* fix a dir separator, for the inherit/guess option */
438
s->namespace->sep = dir_sep;
442
if (!dir_sep && s->namespace)
443
dir_sep = s->namespace->sep; /* inherit */
445
dir_sep = '/'; /* guess */
447
ns = namespace_new (s, full_name, dir_sep);
449
ns->next = s->namespace;
454
camel_store_summary_touch ((CamelStoreSummary *)s);
458
camel_imap_store_summary_namespace_add_secondary (CamelImapStoreSummary *s, const gchar *full_name, gchar dir_sep)
460
CamelImapStoreNamespace **tail;
462
g_return_if_fail (s != NULL);
463
g_return_if_fail (full_name != NULL);
465
if (namespace_find (s->namespace, full_name, dir_sep))
468
for (tail = &s->namespace; *tail; tail = &((*tail)->next)) {
469
/* do nothing, just keep moving to the last */
472
*tail = namespace_new (s, full_name, dir_sep);
475
CamelImapStoreNamespace *
476
camel_imap_store_summary_get_main_namespace (CamelImapStoreSummary *s)
478
g_return_val_if_fail (s != NULL, NULL);
401
483
CamelImapStoreNamespace *
453
namespace_clear(CamelStoreSummary *s)
533
namespace_clear (CamelImapStoreSummary *is)
455
CamelImapStoreSummary *is = (CamelImapStoreSummary *)s;
535
while (is->namespace) {
536
CamelImapStoreNamespace *next = is->namespace->next;
458
namespace_free(s, is->namespace);
459
is->namespace = NULL;
538
namespace_free (is, is->namespace);
539
is->namespace = next;
462
static CamelImapStoreNamespace *
463
namespace_load(CamelStoreSummary *s, FILE *in)
544
namespaces_load (CamelImapStoreSummary *s, FILE *in, guint count)
465
CamelImapStoreNamespace *ns;
546
CamelImapStoreNamespace *ns, **tail;
466
547
guint32 sep = '/';
468
ns = g_malloc0(sizeof(*ns));
469
if (camel_file_util_decode_string(in, &ns->path) == -1
470
|| camel_file_util_decode_string(in, &ns->full_name) == -1
471
|| camel_file_util_decode_uint32(in, &sep) == -1) {
472
namespace_free(s, ns);
551
tail = &s->namespace;
554
ns = g_malloc0 (sizeof(*ns));
555
if (camel_file_util_decode_string (in, &ns->path) == -1
556
|| camel_file_util_decode_string (in, &ns->full_name) == -1
557
|| camel_file_util_decode_uint32 (in, &sep) == -1) {
558
namespace_free (s, ns);
482
namespace_save(CamelStoreSummary *s, FILE *in, CamelImapStoreNamespace *ns)
574
namespaces_save (CamelImapStoreSummary *s, FILE *in, CamelImapStoreNamespace *ns)
484
if (camel_file_util_encode_string(in, ns->path) == -1
485
|| camel_file_util_encode_string(in, ns->full_name) == -1
486
|| camel_file_util_encode_uint32(in, (guint32)ns->sep) == -1)
577
if (camel_file_util_encode_string(in, ns->path) == -1
578
|| camel_file_util_encode_string(in, ns->full_name) == -1
579
|| camel_file_util_encode_uint32(in, (guint32)ns->sep) == -1)
511
/* note file format can be expanded to contain more namespaces, but only 1 at the moment */
512
607
if (camel_file_util_decode_fixed_int32(in, &capabilities) == -1
513
|| camel_file_util_decode_fixed_int32(in, &count) == -1
608
|| camel_file_util_decode_fixed_int32(in, &count) == -1)
517
611
is->capabilities = capabilities;
519
if ((is->namespace = namespace_load(s, in)) == NULL)
613
if (!namespaces_load (is, in, count))
527
621
summary_header_save(CamelStoreSummary *s, FILE *out)
529
623
CamelImapStoreSummary *is = (CamelImapStoreSummary *)s;
625
CamelImapStoreNamespace *ns;
532
count = is->namespace?1:0;
627
for (ns = is->namespace; ns; ns = ns->next) {
534
631
/* always write as latest version */
535
632
if (camel_imap_store_summary_parent->summary_header_save((CamelStoreSummary *)s, out) == -1