if (!attr || !attr->name || !attr->value) continue;
if (!strcmp(attr->name, "type")) {
- if (!strcasecmp(attr->value, "normal"))
+ if (!g_ascii_strcasecmp(attr->value, "normal"))
item->stype = F_NORMAL;
- else if (!strcasecmp(attr->value, "inbox"))
+ else if (!g_ascii_strcasecmp(attr->value, "inbox"))
item->stype = F_INBOX;
- else if (!strcasecmp(attr->value, "outbox"))
+ else if (!g_ascii_strcasecmp(attr->value, "outbox"))
item->stype = F_OUTBOX;
- else if (!strcasecmp(attr->value, "draft"))
+ else if (!g_ascii_strcasecmp(attr->value, "draft"))
item->stype = F_DRAFT;
- else if (!strcasecmp(attr->value, "queue"))
+ else if (!g_ascii_strcasecmp(attr->value, "queue"))
item->stype = F_QUEUE;
- else if (!strcasecmp(attr->value, "trash"))
+ else if (!g_ascii_strcasecmp(attr->value, "trash"))
item->stype = F_TRASH;
} else if (!strcmp(attr->name, "name")) {
if (item->name != NULL)
if (status->str) {
id = folder_item_get_identifier(item);
- g_string_sprintfa(status->str, "%5d %5d %5d %s\n",
+ g_string_append_printf(status->str, "%5d %5d %5d %s\n",
item->new_msgs, item->unread_msgs,
item->total_msgs, id);
g_free(id);
gchar *id;
id = folder_item_get_identifier(item);
- g_string_sprintfa(str, "%5d %5d %5d %s\n",
+ g_string_append_printf(str, "%5d %5d %5d %s\n",
item->new_msgs, item->unread_msgs,
item->total_msgs, id);
g_free(id);
}
if (full)
- g_string_sprintfa(str, "%5d %5d %5d\n", new, unread, total);
+ g_string_append_printf(str, "%5d %5d %5d\n", new, unread, total);
else
- g_string_sprintfa(str, "%d %d %d\n", new, unread, total);
+ g_string_append_printf(str, "%d %d %d\n", new, unread, total);
ret = str->str;
g_string_free(str, FALSE);
FolderItem *child;
for (node = item->node->children; node != NULL; node = node->next) {
+ gchar *base;
child = FOLDER_ITEM(node->data);
- if (strcmp2(g_basename(child->path), name) == 0)
+ base = g_path_get_basename(child->path);
+ if (strcmp2(base, name) == 0) {
+ g_free(base);
return child;
+ }
+ g_free(base);
}
return NULL;
classlist = folder_get_class_list();
for (; classlist != NULL; classlist = g_slist_next(classlist)) {
FolderClass *class = (FolderClass *) classlist->data;
- if (g_strcasecmp(class->idstr, str) == 0)
+ if (g_ascii_strcasecmp(class->idstr, str) == 0)
return class;
}
} else {
flags->perm_flags = 0;
}
- flags->tmp_flags = MSG_CACHED;
if (FOLDER_TYPE(dest->folder) == F_MH) {
if (dest->stype == F_QUEUE) {
MSG_SET_TMP_FLAGS(*flags, MSG_QUEUED);
return folder->klass->close(folder, item);
}
-static void msginfo_set_mime_flags(GNode *node, gpointer data)
-{
- MsgInfo *msginfo = data;
- MimeInfo *mimeinfo = node->data;
-
- if (mimeinfo->disposition == DISPOSITIONTYPE_ATTACHMENT) {
- MSG_SET_TMP_FLAGS(msginfo->flags, MSG_HAS_ATTACHMENT);
- } else if (mimeinfo->disposition == DISPOSITIONTYPE_UNKNOWN &&
- mimeinfo->type != MIMETYPE_TEXT &&
- mimeinfo->type != MIMETYPE_MULTIPART) {
- MSG_SET_TMP_FLAGS(msginfo->flags, MSG_HAS_ATTACHMENT)
- }
-
- /* don't descend below top level message for signed and encrypted info */
- if (mimeinfo->type == MIMETYPE_MESSAGE)
- return;
-
- if (privacy_mimeinfo_is_signed(mimeinfo)) {
- MSG_SET_TMP_FLAGS(msginfo->flags, MSG_SIGNED);
- }
-
- if (privacy_mimeinfo_is_encrypted(mimeinfo)) {
- MSG_SET_TMP_FLAGS(msginfo->flags, MSG_ENCRYPTED);
- } else {
- /* searching inside encrypted parts doesn't really make sense */
- g_node_children_foreach(mimeinfo->node, G_TRAVERSE_ALL, msginfo_set_mime_flags, msginfo);
- }
-}
-
static MsgInfoList *get_msginfos(FolderItem *item, MsgNumberList *numlist)
{
MsgInfoList *msglist = NULL;
Folder *folder = item->folder;
- MsgInfoList *elem;
if (folder->klass->get_msginfos != NULL)
msglist = folder->klass->get_msginfos(folder, item, numlist);
}
}
- for (elem = msglist; elem != NULL; elem = g_slist_next(elem)) {
- MsgInfo *msginfo = elem->data;
-
- if (MSG_IS_MULTIPART(msginfo->flags)) {
- MimeInfo *mimeinfo;
-
- mimeinfo = procmime_scan_message(msginfo);
- g_node_children_foreach(mimeinfo->node, G_TRAVERSE_ALL, msginfo_set_mime_flags, msginfo);
- procmime_mimeinfo_free_all(mimeinfo);
- /* check for attachments */
- }
- }
-
return msglist;
}
return msginfo;
}
+static gint syncronize_flags(FolderItem *item, MsgInfoList *msglist)
+{
+ GRelation *relation;
+ gint ret = 0;
+ GSList *cur;
+
+ if(msglist == NULL)
+ return 0;
+ if(item->folder->klass->get_flags == NULL)
+ return 0;
+
+ relation = g_relation_new(2);
+ g_relation_index(relation, 0, g_direct_hash, g_direct_equal);
+ if ((ret = item->folder->klass->get_flags(
+ item->folder, item, msglist, relation)) == 0) {
+ GTuples *tuples;
+ MsgInfo *msginfo;
+ MsgPermFlags permflags;
+ gboolean skip;
+
+ for (cur = msglist; cur != NULL; cur = g_slist_next(cur)) {
+ msginfo = (MsgInfo *) cur->data;
+
+ tuples = g_relation_select(relation, msginfo, 0);
+ skip = tuples->len < 1;
+ if (!skip)
+ permflags = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
+ g_tuples_destroy(tuples);
+ if (skip)
+ continue;
+
+ if (msginfo->flags.perm_flags != permflags) {
+ procmsg_msginfo_set_flags(msginfo,
+ permflags & ~msginfo->flags.perm_flags, 0);
+ procmsg_msginfo_unset_flags(msginfo,
+ ~permflags & msginfo->flags.perm_flags, 0);
+ }
+ }
+ }
+ g_relation_destroy(relation);
+
+ return ret;
+}
+
gint folder_item_scan_full(FolderItem *item, gboolean filtering)
{
Folder *folder;
guint newcnt = 0, unreadcnt = 0, totalcnt = 0, unreadmarkedcnt = 0;
guint cache_max_num, folder_max_num, cache_cur_num, folder_cur_num;
gboolean update_flags = 0, old_uids_valid = FALSE;
- gint err = -1;
-#ifdef USE_GPGME
- gint old_auto_check = 0;
- old_auto_check = prefs_common.auto_check_signatures;
- prefs_common.auto_check_signatures = 0;
-#endif
- if (item == NULL)
- goto bail_scan;
- if (item->path == NULL)
- goto bail_scan;
+
+ g_return_val_if_fail(item != NULL, -1);
+ if (item->path == NULL) return -1;
folder = item->folder;
- if (folder == NULL)
- goto bail_scan;
- if (folder->klass->get_num_list == NULL)
- goto bail_scan;
+ g_return_val_if_fail(folder != NULL, -1);
+ g_return_val_if_fail(folder->klass->get_num_list != NULL, -1);
debug_print("Scanning folder %s for cache changes.\n", item->path);
/* Get list of messages for folder and cache */
if (folder->klass->get_num_list(item->folder, item, &folder_list, &old_uids_valid) < 0) {
debug_print("Error fetching list of message numbers\n");
- goto bail_scan;
+ return(-1);
}
if (old_uids_valid) {
g_slist_free(new_list);
}
+ syncronize_flags(item, exists_list);
+
folder_item_update_freeze();
if (newmsg_list != NULL) {
GSList *elem;
folder_item_update(item, update_flags);
folder_item_update_thaw();
- err = 0;
-bail_scan:
-#ifdef USE_GPGME
- prefs_common.auto_check_signatures = old_auto_check;
-#endif
- return err;
-}
-gint folder_item_syncronize_flags(FolderItem *item)
-{
- MsgInfoList *msglist = NULL;
- GSList *cur;
- GRelation *relation;
- gint ret = 0;
-
- g_return_val_if_fail(item != NULL, -1);
- g_return_val_if_fail(item->folder != NULL, -1);
- g_return_val_if_fail(item->folder->klass != NULL, -1);
- if(item->folder->klass->get_flags == NULL)
- return 0;
-
- if (item->cache == NULL)
- folder_item_read_cache(item);
-
- msglist = msgcache_get_msg_list(item->cache);
-
- relation = g_relation_new(2);
- g_relation_index(relation, 0, g_direct_hash, g_direct_equal);
- if ((ret = item->folder->klass->get_flags(
- item->folder, item, msglist, relation)) == 0) {
- GTuples *tuples;
- MsgInfo *msginfo;
- MsgPermFlags permflags;
- gboolean skip;
-
- for (cur = msglist; cur != NULL; cur = g_slist_next(cur)) {
- msginfo = (MsgInfo *) cur->data;
-
- tuples = g_relation_select(relation, msginfo, 0);
- skip = tuples->len < 1;
- if (!skip)
- permflags = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
- g_tuples_destroy(tuples);
- if (skip)
- continue;
-
- if (msginfo->flags.perm_flags != permflags) {
- procmsg_msginfo_set_flags(msginfo,
- permflags & ~msginfo->flags.perm_flags, 0);
- procmsg_msginfo_unset_flags(msginfo,
- ~permflags & msginfo->flags.perm_flags, 0);
- }
- }
- }
- g_relation_destroy(relation);
-
- for (cur = msglist; cur != NULL; cur = g_slist_next(cur))
- procmsg_msginfo_free((MsgInfo *) cur->data);
-
- return ret;
+ return 0;
}
gint folder_item_scan(FolderItem *item)
*memusage += msgcache_get_memory_usage(item->cache);
}
+gint folder_item_syncronize_flags(FolderItem *item)
+{
+ MsgInfoList *msglist = NULL;
+ GSList *cur;
+ gint ret = 0;
+
+ g_return_val_if_fail(item != NULL, -1);
+ g_return_val_if_fail(item->folder != NULL, -1);
+ g_return_val_if_fail(item->folder->klass != NULL, -1);
+
+ if (item->cache == NULL)
+ folder_item_read_cache(item);
+
+ msglist = msgcache_get_msg_list(item->cache);
+
+ ret = syncronize_flags(item, msglist);
+
+ for (cur = msglist; cur != NULL; cur = g_slist_next(cur))
+ procmsg_msginfo_free((MsgInfo *) cur->data);
+
+ return ret;
+}
+
gint folder_cache_time_compare_func(gconstpointer a, gconstpointer b)
{
FolderItem *fa = (FolderItem *)a;
return msgcache_get_msg_list(item->cache);
}
+static void msginfo_set_mime_flags(GNode *node, gpointer data)
+{
+ MsgInfo *msginfo = data;
+ MimeInfo *mimeinfo = node->data;
+
+ if (mimeinfo->disposition == DISPOSITIONTYPE_ATTACHMENT) {
+ procmsg_msginfo_set_flags(msginfo, 0, MSG_HAS_ATTACHMENT);
+ } else if (mimeinfo->disposition == DISPOSITIONTYPE_UNKNOWN &&
+ mimeinfo->type != MIMETYPE_TEXT &&
+ mimeinfo->type != MIMETYPE_MULTIPART) {
+ procmsg_msginfo_set_flags(msginfo, 0, MSG_HAS_ATTACHMENT);
+ }
+
+ /* don't descend below top level message for signed and encrypted info */
+ if (mimeinfo->type == MIMETYPE_MESSAGE)
+ return;
+
+ if (privacy_mimeinfo_is_signed(mimeinfo)) {
+ procmsg_msginfo_set_flags(msginfo, 0, MSG_SIGNED);
+ }
+
+ if (privacy_mimeinfo_is_encrypted(mimeinfo)) {
+ procmsg_msginfo_set_flags(msginfo, 0, MSG_ENCRYPTED);
+ } else {
+ /* searching inside encrypted parts doesn't really make sense */
+ g_node_children_foreach(mimeinfo->node, G_TRAVERSE_ALL, msginfo_set_mime_flags, msginfo);
+ }
+}
+
gchar *folder_item_fetch_msg(FolderItem *item, gint num)
{
Folder *folder;
+ gchar *msgfile;
+ MsgInfo *msginfo;
g_return_val_if_fail(item != NULL, NULL);
g_return_val_if_fail(folder->klass->fetch_msg != NULL, NULL);
- return folder->klass->fetch_msg(folder, item, num);
+ msgfile = folder->klass->fetch_msg(folder, item, num);
+
+ if (msgfile != NULL) {
+ msginfo = folder_item_get_msginfo(item, num);
+ if ((msginfo != NULL) && !MSG_IS_SCANNED(msginfo->flags)) {
+ MimeInfo *mimeinfo;
+
+ if (msginfo->folder->stype != F_QUEUE &&
+ msginfo->folder->stype != F_DRAFT)
+ mimeinfo = procmime_scan_file(msgfile);
+ else
+ mimeinfo = procmime_scan_queue_file(msgfile);
+ /* check for attachments */
+ if (mimeinfo != NULL) {
+ g_node_children_foreach(mimeinfo->node, G_TRAVERSE_ALL, msginfo_set_mime_flags, msginfo);
+ procmime_mimeinfo_free_all(mimeinfo);
+
+ procmsg_msginfo_set_flags(msginfo, 0, MSG_SCANNED);
+ }
+ }
+ }
+
+ return msgfile;
}
gint folder_item_fetch_all_msg(FolderItem *item)
FolderItem *next_item;
GNode *srcnode;
gchar *old_id, *new_id;
- gint err = 1;
-#ifdef USE_GPGME
- gint old_auto_check = 0;
- old_auto_check = prefs_common.auto_check_signatures;
- prefs_common.auto_check_signatures = 0;
-#endif
+
mlist = folder_item_get_msg_list(src);
/* move messages */
new_item = folder_create_folder(dest, src->name);
if (new_item == NULL) {
printf("Can't create folder\n");
- goto bail_move;
+ return NULL;
}
if (new_item->folder == NULL)
next_item = (FolderItem*) srcnode->data;
srcnode = srcnode->next;
if (folder_item_move_recursive(next_item, new_item) == NULL)
- goto bail_move;
+ return NULL;
}
}
old_id = folder_item_get_identifier(src);
prefs_filtering_rename_path(old_id, new_id);
g_free(old_id);
g_free(new_id);
- err = 0;
-bail_move:
-#ifdef USE_GPGME
- prefs_common.auto_check_signatures = old_auto_check;
-#endif
-
- if (err != 0)
- return NULL;
- else
- return new_item;
+ return new_item;
}
gint folder_item_move_to(FolderItem *src, FolderItem *dest, FolderItem **new_item)
}
phys_srcpath = folder_item_get_path(src);
- phys_dstpath = g_strconcat(folder_item_get_path(dest),G_DIR_SEPARATOR_S,g_basename(phys_srcpath),NULL);
+ phys_dstpath = g_strconcat(folder_item_get_path(dest),
+ G_DIR_SEPARATOR_S,
+ g_path_get_basename(phys_srcpath),
+ NULL);
if (folder_item_parent(src) == dest || src == dest) {
g_free(src_identifier);
g_tuples_destroy(tuples);
if (num >= 0) {
- MsgInfo *newmsginfo;
+ MsgInfo *newmsginfo = NULL;
if (folderscan) {
if (msginfo->msgid != NULL) {
static void folder_item_update_with_msg(FolderItem *item, FolderItemUpdateFlags update_flags, MsgInfo *msg)
{
- if (folder_item_update_freeze_cnt == 0 || (msg != NULL && item->opened)) {
+ if (folder_item_update_freeze_cnt == 0 /* || (msg != NULL && item->opened) */) {
FolderItemUpdateData source;
source.item = item;