static gboolean update_cache (CamelGroupwiseJournal *groupwise_journal, CamelMimeMessage *message, const CamelMessageInfo *mi, char **updated_uid, CamelException *ex) { CamelOfflineJournal *journal = (CamelOfflineJournal *) groupwise_journal; CamelGroupwiseFolder *groupwise_folder = (CamelGroupwiseFolder *) journal->folder; CamelFolder *folder = (CamelFolder *) journal->folder; CamelMessageInfo *info; CamelStream *cache; guint32 nextuid; char *uid; if (groupwise_folder->cache == NULL) { camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot append message in offline mode: cache unavailable")); return FALSE; } nextuid = camel_folder_summary_next_uid (folder->summary); uid = g_strdup_printf ("-%u", nextuid); if (!(cache = camel_data_cache_add (groupwise_folder->cache, "cache", uid, ex))) { folder->summary->nextuid--; g_free (uid); return FALSE; } if (camel_data_wrapper_write_to_stream ((CamelDataWrapper *) message, cache) == -1 || camel_stream_flush (cache) == -1) { camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot append message in offline mode: %s"), g_strerror (errno)); camel_data_cache_remove (groupwise_folder->cache, "cache", uid, NULL); folder->summary->nextuid--; camel_object_unref (cache); g_free (uid); return FALSE; } camel_object_unref (cache); info = camel_folder_summary_info_new_from_message (folder->summary, message); g_free(info->uid); info->uid = g_strdup (uid); gw_message_info_dup_to ((CamelMessageInfoBase *) info, (CamelMessageInfoBase *) mi); camel_folder_summary_add (folder->summary, info); if (updated_uid) *updated_uid = g_strdup (uid); g_free (uid); return TRUE; }
static CamelStream * nntp_folder_download_message (CamelNNTPFolder *nntp_folder, const char *id, const char *msgid, CamelException *ex) { CamelNNTPStore *nntp_store = (CamelNNTPStore *) ((CamelFolder *) nntp_folder)->parent_store; CamelStream *stream = NULL; int ret; char *line; ret = camel_nntp_command (nntp_store, ex, nntp_folder, &line, "article %s", id); if (ret == 220) { stream = camel_data_cache_add (nntp_store->cache, "cache", msgid, NULL); if (stream) { if (camel_stream_write_to_stream ((CamelStream *) nntp_store->stream, stream) == -1) goto fail; if (camel_stream_reset (stream) == -1) goto fail; } else { stream = (CamelStream *) nntp_store->stream; camel_object_ref (stream); } } else if (ret == 423 || ret == 430) { camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID, _("Cannot get message %s: %s"), msgid, line); } else if (ret != -1) { camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot get message %s: %s"), msgid, line); } return stream; fail: if (errno == EINTR) camel_exception_setv (ex, CAMEL_EXCEPTION_USER_CANCEL, _("User canceled")); else camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot get message %s: %s"), msgid, g_strerror (errno)); return NULL; }
static CamelStream * nntp_folder_download_message (CamelNNTPFolder *nntp_folder, const gchar *id, const gchar *msgid, GCancellable *cancellable, GError **error) { CamelFolder *folder; CamelStore *parent_store; CamelDataCache *nntp_cache; CamelNNTPStore *nntp_store; CamelNNTPStream *nntp_stream = NULL; CamelStream *stream = NULL; gint ret; gchar *line; folder = CAMEL_FOLDER (nntp_folder); parent_store = camel_folder_get_parent_store (folder); nntp_store = CAMEL_NNTP_STORE (parent_store); nntp_cache = camel_nntp_store_ref_cache (nntp_store); ret = camel_nntp_command ( nntp_store, cancellable, error, nntp_folder, &line, "article %s", id); if (ret == 220) { GIOStream *base_stream; nntp_stream = camel_nntp_store_ref_stream (nntp_store); base_stream = camel_data_cache_add ( nntp_cache, "cache", msgid, NULL); if (base_stream != NULL) { gboolean success; stream = camel_stream_new (base_stream); g_object_unref (base_stream); success = (camel_stream_write_to_stream ( CAMEL_STREAM (nntp_stream), stream, cancellable, error) != -1); if (!success) goto fail; success = g_seekable_seek ( G_SEEKABLE (stream), 0, G_SEEK_SET, cancellable, error); if (!success) goto fail; } else { stream = g_object_ref (nntp_stream); } } else if (ret == 423 || ret == 430) { g_set_error ( error, CAMEL_FOLDER_ERROR, CAMEL_FOLDER_ERROR_INVALID_UID, _("Cannot get message %s: %s"), msgid, line); } else if (ret != -1) { g_set_error ( error, CAMEL_ERROR, CAMEL_ERROR_GENERIC, _("Cannot get message %s: %s"), msgid, line); } goto exit; fail: camel_data_cache_remove (nntp_cache, "cache", msgid, NULL); g_prefix_error (error, _("Cannot get message %s: "), msgid); g_clear_object (&stream); exit: g_clear_object (&nntp_cache); g_clear_object (&nntp_stream); return stream; }