~ubuntu-branches/ubuntu/saucy/evolution-data-server/saucy

« back to all changes in this revision

Viewing changes to camel/camel-imapx-store.c

  • Committer: Package Import Robot
  • Author(s): Chris Coulson
  • Date: 2012-10-08 12:58:16 UTC
  • mfrom: (181.1.7 quantal)
  • Revision ID: package-import@ubuntu.com-20121008125816-i3n76e8c0m64e7xp
Tags: 3.6.0-0ubuntu2
* Fix LP: #1038047 part 1 - Don't abort in e_source_registry_new* when a
  problem occurs connecting to the Dbus service
  - add debian/patches/dont-abort-in-e_source_registry_new.patch
  - update debian/patches/series
* Fix LP: #1038047 part 2 - libedataserver depends on
  evolution-data-server-common to ensure that the GSettings schemas are
  present
  - update debian/control

Show diffs side-by-side

added added

removed removed

Lines of Context:
76
76
static guint
77
77
imapx_name_hash (gconstpointer key)
78
78
{
79
 
        if (g_ascii_strcasecmp(key, "INBOX") == 0)
80
 
                return g_str_hash("INBOX");
 
79
        if (g_ascii_strcasecmp (key, "INBOX") == 0)
 
80
                return g_str_hash ("INBOX");
81
81
        else
82
82
                return g_str_hash (key);
83
83
}
84
84
 
85
 
static gint
 
85
static gboolean
86
86
imapx_name_equal (gconstpointer a,
87
87
                  gconstpointer b)
88
88
{
89
89
        gconstpointer aname = a, bname = b;
90
90
 
91
 
        if (g_ascii_strcasecmp(a, "INBOX") == 0)
 
91
        if (g_ascii_strcasecmp (a, "INBOX") == 0)
92
92
                aname = "INBOX";
93
 
        if (g_ascii_strcasecmp(b, "INBOX") == 0)
 
93
        if (g_ascii_strcasecmp (b, "INBOX") == 0)
94
94
                bname = "INBOX";
95
95
        return g_str_equal (aname, bname);
96
96
}
144
144
        gchar *user;
145
145
        gchar *name;
146
146
 
147
 
        settings = camel_service_get_settings (service);
 
147
        settings = camel_service_ref_settings (service);
148
148
 
149
149
        network_settings = CAMEL_NETWORK_SETTINGS (settings);
150
150
        host = camel_network_settings_dup_host (network_settings);
151
151
        user = camel_network_settings_dup_user (network_settings);
152
152
 
 
153
        g_object_unref (settings);
 
154
 
153
155
        if (brief)
154
156
                name = g_strdup_printf (
155
157
                        _("IMAP server %s"), host);
263
265
        CamelIMAPXStore *istore = CAMEL_IMAPX_STORE (service);
264
266
        CamelServiceAuthType *authtype;
265
267
        GList *sasl_types, *t, *next;
 
268
        CamelIMAPXServer *server;
 
269
        CamelIMAPXStream *stream;
266
270
        gboolean connected;
267
 
        CamelIMAPXServer *server;
268
271
 
269
272
        if (!camel_offline_store_get_online (CAMEL_OFFLINE_STORE (istore))) {
270
273
                g_set_error (
274
277
                return NULL;
275
278
        }
276
279
 
277
 
        server = camel_imapx_server_new (CAMEL_STORE (istore));
278
 
 
279
 
        connected = server->stream != NULL;
280
 
        if (!connected)
281
 
                connected = imapx_connect_to_server (server, cancellable, error);
 
280
        server = camel_imapx_server_new (istore);
 
281
 
 
282
        stream = camel_imapx_server_ref_stream (server);
 
283
        if (stream != NULL) {
 
284
                connected = TRUE;
 
285
                g_object_unref (stream);
 
286
        } else {
 
287
                connected = imapx_connect_to_server (
 
288
                        server, cancellable, error);
 
289
        }
 
290
 
282
291
        if (!connected)
283
292
                return NULL;
284
293
 
314
323
        user_cache_dir = camel_service_get_user_cache_dir (service);
315
324
 
316
325
        si = camel_store_summary_path ((CamelStoreSummary *) imapx_store->summary, folder_name);
 
326
        if (!si && g_ascii_strcasecmp (folder_name, "INBOX") == 0)
 
327
                si = (CamelStoreInfo *) camel_imapx_store_summary_full_name (imapx_store->summary, folder_name);
317
328
        if (si) {
318
329
                gchar *folder_dir, *storage_path;
319
330
 
 
331
                storage_path = g_build_filename (user_cache_dir, "folders", NULL);
320
332
                /* Note: Although the INBOX is defined to be case-insensitive in the IMAP RFC
321
333
                 * it is still up to the server how to acutally name it in a LIST response. Since
322
334
                 * we stored the name as the server provided it us in the summary we take that name
324
336
                 * But for the on-disk cache we do always capitalize the Inbox no matter what the
325
337
                 * server provided.
326
338
                 */
327
 
                if (!g_ascii_strcasecmp (folder_name, "INBOX"))
328
 
                        folder_name = "INBOX";
329
 
 
330
 
                storage_path = g_build_filename (user_cache_dir, "folders", NULL);
331
 
                folder_dir = imapx_path_to_physical (storage_path, folder_name);
 
339
                folder_dir = imapx_path_to_physical (storage_path,
 
340
                        g_ascii_strcasecmp (folder_name, "INBOX") == 0 ? "INBOX" : folder_name);
332
341
                g_free (storage_path);
333
 
                /* FIXME */
 
342
 
334
343
                new_folder = camel_imapx_folder_new (store, folder_dir, folder_name, error);
335
344
 
336
345
                g_free (folder_dir);
390
399
        CamelSettings *settings;
391
400
        gboolean mobile_mode;
392
401
 
393
 
        settings = camel_service_get_settings (service);
 
402
        settings = camel_service_ref_settings (service);
 
403
 
394
404
        mobile_mode = camel_imapx_settings_get_mobile_mode (
395
405
                CAMEL_IMAPX_SETTINGS (settings));
396
406
 
 
407
        g_object_unref (settings);
 
408
 
397
409
        folder = camel_object_bag_peek (store->folders, fi->full_name);
398
410
        if (folder) {
399
411
                CamelIMAPXSummary *ims;
425
437
{
426
438
        const gchar *a = ap;
427
439
 
428
 
        if (g_ascii_strcasecmp(a, "INBOX") == 0)
 
440
        if (g_ascii_strcasecmp (a, "INBOX") == 0)
429
441
                a = "INBOX";
430
442
 
431
443
        return g_str_hash (a);
438
450
        const gchar *a = ap;
439
451
        const gchar *b = bp;
440
452
 
441
 
        if (g_ascii_strcasecmp(a, "INBOX") == 0)
 
453
        if (g_ascii_strcasecmp (a, "INBOX") == 0)
442
454
                a = "INBOX";
443
 
        if (g_ascii_strcasecmp(b, "INBOX") == 0)
 
455
        if (g_ascii_strcasecmp (b, "INBOX") == 0)
444
456
                b = "INBOX";
445
457
 
446
458
        return g_str_equal (a, b);
457
469
                return TRUE;
458
470
 
459
471
        dir_sep = ns->sep;
 
472
        if (!dir_sep)
 
473
                dir_sep = '/';
460
474
        p = *pattern++;
461
475
        n = *name++;
462
476
        while (n && p) {
550
564
        if (!server)
551
565
                return FALSE;
552
566
 
 
567
        if (folder_name && *folder_name == '/')
 
568
                folder_name++;
 
569
 
553
570
        success = camel_imapx_server_manage_subscription (
554
571
                server, folder_name, TRUE, cancellable, error);
555
572
        g_object_unref (server);
578
595
        if (!server)
579
596
                return FALSE;
580
597
 
 
598
        if (folder_name && *folder_name == '/')
 
599
                folder_name++;
 
600
 
581
601
        success = camel_imapx_server_manage_subscription (
582
602
                server, folder_name, FALSE, cancellable, error);
583
603
        g_object_unref (server);
652
672
                path = camel_store_info_path (istore->summary, si);
653
673
                if (strncmp (path, old_name, olen) == 0) {
654
674
                        if (strlen (path) > olen)
655
 
                                npath = g_strdup_printf("%s/%s", new_name, path+olen+1);
 
675
                                npath = g_strdup_printf ("%s/%s", new_name, path + olen + 1);
656
676
                        else
657
677
                                npath = g_strdup (new_name);
658
678
                        nfull = camel_imapx_store_summary_path_to_full (istore->summary, npath, istore->dir_sep);
686
706
        gint i;
687
707
 
688
708
        service = CAMEL_SERVICE (store);
689
 
        settings = camel_service_get_settings (service);
 
709
 
 
710
        settings = camel_service_ref_settings (service);
690
711
 
691
712
        use_namespace = camel_imapx_settings_get_use_namespace (
692
713
                CAMEL_IMAPX_SETTINGS (settings));
694
715
        use_subscriptions = camel_imapx_settings_get_use_subscriptions (
695
716
                CAMEL_IMAPX_SETTINGS (settings));
696
717
 
 
718
        g_object_unref (settings);
 
719
 
697
720
        /* FIXME: obey other flags */
698
721
 
699
722
        folders = g_ptr_array_new ();
707
730
        if (top[0] == 0) {
708
731
                gchar *namespace = NULL;
709
732
 
710
 
                if (use_namespace)
 
733
                if (use_namespace) {
 
734
                        settings = camel_service_ref_settings (service);
 
735
 
711
736
                        namespace = camel_imapx_settings_dup_namespace (
712
737
                                CAMEL_IMAPX_SETTINGS (settings));
713
738
 
 
739
                        g_object_unref (settings);
 
740
                }
 
741
 
714
742
                if (namespace != NULL) {
715
743
                        name = g_strdup (imapx_store->summary->namespaces->personal->full_name);
716
744
                        top = imapx_store->summary->namespaces->personal->path;
717
745
                } else
718
 
                        name = g_strdup("");
 
746
                        name = g_strdup ("");
719
747
 
720
748
                g_free (namespace);
721
749
        } else {
724
752
                        name = camel_imapx_store_summary_path_to_full (imapx_store->summary, top, imapx_store->dir_sep);
725
753
        }
726
754
 
727
 
        pattern = imapx_concat(imapx_store, name, "*");
 
755
        pattern = imapx_concat (imapx_store, name, "*");
728
756
 
729
757
        /* folder_info_build will insert parent nodes as necessary and mark
730
758
         * them as noselect, which is information we actually don't have at
767
795
                                fi->flags = (fi->flags & ~CAMEL_FOLDER_NOINFERIORS) | CAMEL_FOLDER_NOCHILDREN;
768
796
 
769
797
                        /* blah, this gets lost somewhere, i can't be bothered finding out why */
770
 
                        if (!g_ascii_strcasecmp(fi->full_name, "inbox")) {
 
798
                        if (!g_ascii_strcasecmp (fi->full_name, "inbox")) {
771
799
                                fi->flags = (fi->flags & ~CAMEL_FOLDER_TYPE_MASK) | CAMEL_FOLDER_TYPE_INBOX;
772
800
                                fi->flags |= CAMEL_FOLDER_SYSTEM;
773
801
                        }
833
861
 
834
862
                fi = camel_folder_info_new ();
835
863
                fi->full_name = g_strdup (camel_store_info_path (istore->summary, si));
836
 
                if (!g_ascii_strcasecmp(fi->full_name, "inbox")) {
 
864
                if (!g_ascii_strcasecmp (fi->full_name, "inbox")) {
837
865
                        li->flags |= CAMEL_FOLDER_SYSTEM | CAMEL_FOLDER_TYPE_INBOX;
838
866
                        fi->display_name = g_strdup (_("Inbox"));
839
867
                } else
979
1007
                        ns = ns->next;
980
1008
                }
981
1009
        }
982
 
        g_list_free (namespaces);
983
1010
 out:
 
1011
        g_list_free (namespaces);
984
1012
        g_object_unref (server);
985
1013
        return folders;
986
1014
 
987
1015
exception:
 
1016
        g_list_free (namespaces);
988
1017
        g_object_unref (server);
989
1018
        g_hash_table_destroy (folders);
990
1019
        return NULL;
1093
1122
        CamelStoreInfo *si;
1094
1123
        CamelIMAPXStore *istore = (CamelIMAPXStore *) store;
1095
1124
 
1096
 
        si = camel_store_summary_path((CamelStoreSummary *) istore->summary, "INBOX");
 
1125
        si = camel_store_summary_path ((CamelStoreSummary *) istore->summary, "INBOX");
1097
1126
        if (si == NULL || (si->flags & CAMEL_FOLDER_SUBSCRIBED) == 0) {
1098
1127
                if (imapx_subscribe_folder (store, "INBOX", FALSE, cancellable, NULL) && !si)
1099
1128
                        sync_folders (istore, "INBOX", TRUE, cancellable, NULL);
1120
1149
        store_class = CAMEL_STORE_CLASS (camel_imapx_store_parent_class);
1121
1150
 
1122
1151
        service = CAMEL_SERVICE (store);
1123
 
        settings = camel_service_get_settings (service);
 
1152
 
 
1153
        settings = camel_service_ref_settings (service);
1124
1154
 
1125
1155
        check_all = camel_imapx_settings_get_check_all (
1126
1156
                CAMEL_IMAPX_SETTINGS (settings));
1128
1158
        check_subscribed = camel_imapx_settings_get_check_subscribed (
1129
1159
                CAMEL_IMAPX_SETTINGS (settings));
1130
1160
 
 
1161
        g_object_unref (settings);
 
1162
 
1131
1163
        subscribed = ((info->flags & CAMEL_FOLDER_SUBSCRIBED) != 0);
1132
1164
 
1133
1165
        res = store_class->can_refresh_folder (store, info, &local_error) ||
1193
1225
 
1194
1226
        service = CAMEL_SERVICE (store);
1195
1227
        session = camel_service_get_session (service);
1196
 
        settings = camel_service_get_settings (service);
 
1228
 
 
1229
        settings = camel_service_ref_settings (service);
1197
1230
 
1198
1231
        use_subscriptions = camel_imapx_settings_get_use_subscriptions (
1199
1232
                CAMEL_IMAPX_SETTINGS (settings));
1200
1233
 
 
1234
        g_object_unref (settings);
 
1235
 
1201
1236
        if (top == NULL)
1202
1237
                top = "";
1203
1238
 
1353
1388
        CamelIMAPXServer *server;
1354
1389
        gchar *real_name, *full_name, *parent_real;
1355
1390
        CamelFolderInfo *fi = NULL;
1356
 
        gchar dir_sep;
 
1391
        gchar dir_sep = 0;
1357
1392
        gboolean success;
1358
1393
 
1359
1394
        if (!camel_offline_store_get_online (CAMEL_OFFLINE_STORE (store))) {
1374
1409
        ns = camel_imapx_store_summary_namespace_find_path (istore->summary, parent_name);
1375
1410
        if (ns)
1376
1411
                dir_sep = ns->sep;
1377
 
        else
 
1412
 
 
1413
        if (!dir_sep)
1378
1414
                dir_sep = '/';
1379
1415
 
1380
1416
        if (strchr (folder_name, dir_sep)) {
1484
1520
        gboolean success = FALSE;
1485
1521
 
1486
1522
        service = CAMEL_SERVICE (store);
1487
 
        settings = camel_service_get_settings (service);
1488
1523
        user_cache_dir = camel_service_get_user_cache_dir (service);
1489
1524
 
 
1525
        settings = camel_service_ref_settings (service);
 
1526
 
1490
1527
        use_subscriptions = camel_imapx_settings_get_use_subscriptions (
1491
1528
                CAMEL_IMAPX_SETTINGS (settings));
1492
1529
 
 
1530
        g_object_unref (settings);
 
1531
 
1493
1532
        if (!camel_offline_store_get_online (CAMEL_OFFLINE_STORE (store))) {
1494
1533
                g_set_error (
1495
1534
                        error, CAMEL_SERVICE_ERROR,
1503
1542
 
1504
1543
        /* Use INBOX connection as the implementation would try to select inbox to ensure
1505
1544
         * we are not selected on the folder being renamed */
1506
 
        server = camel_imapx_store_get_server(istore, "INBOX", cancellable, error);
 
1545
        server = camel_imapx_store_get_server (istore, "INBOX", cancellable, error);
1507
1546
        if (server) {
1508
1547
                success = camel_imapx_server_rename_folder (
1509
1548
                        server, old, new, cancellable, error);
1677
1716
        CamelStoreInfo *si;
1678
1717
        gint is_subscribed = FALSE;
1679
1718
 
 
1719
        if (folder_name && *folder_name == '/')
 
1720
                folder_name++;
 
1721
 
1680
1722
        si = camel_store_summary_path ((CamelStoreSummary *) istore->summary, folder_name);
1681
1723
        if (si) {
1682
1724
                is_subscribed = (si->flags & CAMEL_STORE_INFO_FOLDER_SUBSCRIBED) != 0;
1729
1771
 
1730
1772
        store_class = CAMEL_STORE_CLASS (class);
1731
1773
        store_class->hash_folder_name = imapx_name_hash;
1732
 
        store_class->compare_folder_name = imapx_name_equal;
 
1774
        store_class->equal_folder_name = imapx_name_equal;
1733
1775
        store_class->can_refresh_folder = imapx_can_refresh_folder;
1734
1776
        store_class->free_folder_info = camel_store_free_folder_info_full;
1735
1777
        store_class->get_folder_sync = imapx_store_get_folder_sync;