+2003-04-02 [christoph] 0.8.11claws70
+
+ * src/folder.[ch]
+ * src/imap.[ch]
+ * src/mbox_folder.[ch]
+ * src/mh.[ch]
+ * src/news.[ch]
+ o Make all virtual folder functions private
+ o remove unused folder code
+
+ * src/common/socket.[ch]
+ * src/summaryview.c
+ fix warnings
+
2003-03-30 [alfons] 0.8.11claws69
* src/send_message.c
MICRO_VERSION=11
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=claws69
+EXTRA_VERSION=claws70
VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION
dnl set $target
return sock_write_all(sock, buf, strlen(buf));
}
-gint sock_read(SockInfo *sock, gchar *buf, gint len)
-{
- gint ret;
-
- g_return_val_if_fail(sock != NULL, -1);
-
-#if USE_OPENSSL
- if (sock->ssl)
- ret = ssl_read(sock->ssl, buf, len);
- else
-#endif
- ret = fd_read(sock->sock, buf, len);
-
- if (ret < 0)
- sock->state = CONN_DISCONNECTED;
- return ret;
-}
-
gint fd_read(gint fd, gchar *buf, gint len)
{
if (fd_check_io(fd, G_IO_IN) < 0)
}
#endif
-gint sock_write(SockInfo *sock, const gchar *buf, gint len)
+gint sock_read(SockInfo *sock, gchar *buf, gint len)
{
gint ret;
#if USE_OPENSSL
if (sock->ssl)
- ret = ssl_write(sock->ssl, buf, len);
+ ret = ssl_read(sock->ssl, buf, len);
else
#endif
- ret = fd_write(sock->sock, buf, len);
-
+ ret = fd_read(sock->sock, buf, len);
+
if (ret < 0)
sock->state = CONN_DISCONNECTED;
return ret;
}
#endif
-gint sock_write_all(SockInfo *sock, const gchar *buf, gint len)
+gint sock_write(SockInfo *sock, const gchar *buf, gint len)
{
gint ret;
#if USE_OPENSSL
if (sock->ssl)
- ret = ssl_write_all(sock->ssl, buf, len);
+ ret = ssl_write(sock->ssl, buf, len);
else
#endif
- ret = fd_write_all(sock->sock, buf, len);
+ ret = fd_write(sock->sock, buf, len);
if (ret < 0)
sock->state = CONN_DISCONNECTED;
}
#endif
+gint sock_write_all(SockInfo *sock, const gchar *buf, gint len)
+{
+ gint ret;
+
+ g_return_val_if_fail(sock != NULL, -1);
+
+#if USE_OPENSSL
+ if (sock->ssl)
+ ret = ssl_write_all(sock->ssl, buf, len);
+ else
+#endif
+ ret = fd_write_all(sock->sock, buf, len);
+
+ if (ret < 0)
+ sock->state = CONN_DISCONNECTED;
+ return ret;
+}
+
gint fd_recv(gint fd, gchar *buf, gint len, gint flags)
{
if (fd_check_io(fd, G_IO_IN) < 0)
return ret;
}
-gchar *fd_getline(gint fd)
+gint fd_getline(gint fd, gchar **str)
{
gchar buf[BUFFSIZE];
- gchar *str = NULL;
gint len;
gulong size = 1;
while ((len = fd_gets(fd, buf, sizeof(buf))) > 0) {
size += len;
- if (!str)
- str = g_strdup(buf);
+ if (!*str)
+ *str = g_strdup(buf);
else {
- str = g_realloc(str, size);
- strcat(str, buf);
+ *str = g_realloc(*str, size);
+ strcat(*str, buf);
}
if (buf[len - 1] == '\n')
break;
}
- if (len == -1) {
- log_error("Read from socket fd%d failed: %s\n",
- fd, strerror(errno));
- if (str)
- g_free(str);
- return NULL;
- }
+ if (len == -1 && *str)
+ g_free(*str);
- return str;
+ return len;
}
#if USE_OPENSSL
-gchar *ssl_getline(SSL *ssl)
+gint ssl_getline(SSL *ssl, gchar **str)
{
gchar buf[BUFFSIZE];
- gchar *str = NULL;
gint len;
gulong size = 1;
while ((len = ssl_gets(ssl, buf, sizeof(buf))) > 0) {
size += len;
- if (!str)
- str = g_strdup(buf);
+ if (!*str)
+ *str = g_strdup(buf);
else {
- str = g_realloc(str, size);
- strcat(str, buf);
+ *str = g_realloc(*str, size);
+ strcat(*str, buf);
}
if (buf[len - 1] == '\n')
break;
}
+ if (len == -1 && *str)
+ g_free(*str);
- return str;
+ return len;
}
#endif
gchar *sock_getline(SockInfo *sock)
{
gint ret;
+ gchar *str = NULL;
g_return_val_if_fail(sock != NULL, NULL);
#if USE_OPENSSL
if (sock->ssl)
- ret = ssl_getline(sock->ssl);
+ ret = ssl_getline(sock->ssl, &str);
else
#endif
- ret = fd_getline(sock->sock);
+ ret = fd_getline(sock->sock, &str);
if (ret < 0)
sock->state = CONN_DISCONNECTED;
- return ret;
+ return str;
}
gint sock_puts(SockInfo *sock, const gchar *buf)
gint fd_write (gint sock, const gchar *buf, gint len);
gint fd_write_all (gint sock, const gchar *buf, gint len);
gint fd_gets (gint sock, gchar *buf, gint len);
-gchar *fd_getline (gint sock);
+gint fd_getline (gint sock, gchar **str);
gint fd_close (gint sock);
/* Functions for SSL */
remove_msginfo_from_cache(item, msginfo);
procmsg_msginfo_free(msginfo);
}
- item->total--;
folder_item_update(item, F_ITEM_UPDATE_MSGCNT | F_ITEM_UPDATE_CONTENT);
return ret;
if (!item->cache) folder_item_read_cache(item);
- if (folder->class->remove_msgs) {
- ret = folder->class->remove_msgs(folder, item, msglist);
- if (ret == 0)
- folder_item_scan(item);
- return ret;
- }
-
while (msglist != NULL) {
MsgInfo *msginfo = (MsgInfo *)msglist->data;
FolderItem *dest,
const gchar *file,
gboolean remove_source);
- gint (*move_msg) (Folder *folder,
- FolderItem *dest,
- MsgInfo *msginfo);
- gint (*move_msgs_with_dest) (Folder *folder,
- FolderItem *dest,
- GSList *msglist);
gint (*copy_msg) (Folder *folder,
FolderItem *dest,
MsgInfo *msginfo);
- gint (*copy_msgs_with_dest) (Folder *folder,
- FolderItem *dest,
- GSList *msglist);
gint (*remove_msg) (Folder *folder,
FolderItem *item,
gint num);
- gint (*remove_msgs) (Folder *folder,
- FolderItem *item,
- GSList *msglist);
gint (*remove_all_msg) (Folder *folder,
FolderItem *item);
gboolean (*is_msg_changed) (Folder *folder,
GSList *uid_list;
};
-static GList *session_list = NULL;
+static Folder *imap_folder_new(const gchar * name, const gchar * path);
+static void imap_folder_destroy(Folder * folder);
+
+static Session *imap_session_new(const PrefsAccount * account);
+static void imap_session_authenticate(IMAPSession * session,
+ const PrefsAccount * account);
+static void imap_session_destroy(Session * session);
+
+static gchar *imap_fetch_msg(Folder * folder, FolderItem * item, gint uid);
+static gint imap_add_msg(Folder * folder,
+ FolderItem * dest,
+ const gchar * file, gboolean remove_source);
+
+static gint imap_copy_msg(Folder * folder,
+ FolderItem * dest, MsgInfo * msginfo);
+
+static gint imap_remove_msg(Folder * folder, FolderItem * item, gint uid);
+static gint imap_remove_all_msg(Folder * folder, FolderItem * item);
+
+static gboolean imap_is_msg_changed(Folder * folder,
+ FolderItem * item, MsgInfo * msginfo);
+
+static gint imap_scan_folder(Folder * folder, FolderItem * item);
+static void imap_scan_tree(Folder * folder);
+
+static gint imap_create_tree(Folder * folder);
+
+static FolderItem *imap_create_folder(Folder * folder,
+ FolderItem * parent,
+ const gchar * name);
+static gint imap_rename_folder(Folder * folder,
+ FolderItem * item, const gchar * name);
+static gint imap_remove_folder(Folder * folder, FolderItem * item);
+
static gint imap_cmd_count = 0;
FolderItem *dest,
MsgInfo *msginfo,
gboolean remove_source);
-#if 0
-static gint imap_do_copy_msgs_with_dest (Folder *folder,
- FolderItem *dest,
- GSList *msglist,
- gboolean remove_source);
-#endif
static GSList *imap_get_uncached_messages (IMAPSession *session,
FolderItem *item,
#endif
#if USE_OPENSSL
-static SockInfo *imap_init_sock(SockInfo *sock, SSLType ssl_type);
+static SockInfo *imap_init_sock(SockInfo *sock, SSLType ssl_type);
#else
static SockInfo *imap_init_sock(SockInfo *sock);
#endif
static gint imap_cmd_envelope (SockInfo *sock,
guint32 first_uid,
guint32 last_uid);
-#if 0
-static gint imap_cmd_search (SockInfo *sock,
- GSList *numlist);
-#endif
static gint imap_cmd_fetch (SockInfo *sock,
guint32 uid,
const gchar *filename);
static gboolean imap_rename_folder_func (GNode *node,
gpointer data);
-gint imap_get_num_list (Folder *folder,
+static gint imap_get_num_list (Folder *folder,
FolderItem *item,
GSList **list);
-GSList *imap_get_msginfos (Folder *folder,
+static GSList *imap_get_msginfos (Folder *folder,
FolderItem *item,
GSList *msgnum_list);
-MsgInfo *imap_get_msginfo (Folder *folder,
+static MsgInfo *imap_get_msginfo (Folder *folder,
FolderItem *item,
gint num);
-gboolean imap_check_msgnum_validity (Folder *folder,
+static gboolean imap_check_msgnum_validity (Folder *folder,
FolderItem *item);
-void imap_change_flags (Folder *folder,
+static void imap_change_flags (Folder *folder,
FolderItem *item,
MsgInfo *msginfo,
MsgPermFlags newflags);
imap_get_msginfos,
imap_fetch_msg,
imap_add_msg,
- imap_move_msg,
- NULL,
imap_copy_msg,
- NULL,
imap_remove_msg,
- imap_remove_msgs,
imap_remove_all_msg,
imap_is_msg_changed,
imap_change_flags,
session->mbox = NULL;
session->authenticated = is_preauth;
- session_list = g_list_append(session_list, session);
-
return SESSION(session);
}
g_free(IMAP_SESSION(session)->mbox);
g_strfreev(IMAP_SESSION(session)->capability);
-
- session_list = g_list_remove(session_list, session);
-}
-
-void imap_session_destroy_all(void)
-{
- while (session_list != NULL) {
- IMAPSession *session = (IMAPSession *)session_list->data;
-
- imap_cmd_logout(SESSION(session)->sock);
- session_destroy(SESSION(session));
- }
}
gchar *imap_fetch_msg(Folder *folder, FolderItem *item, gint uid)
return -1;
}
-#if 0
-static gint imap_do_copy_msgs_with_dest(Folder *folder, FolderItem *dest,
- GSList *msglist,
- gboolean remove_source)
-{
- gchar *destdir;
- GSList *cur;
- MsgInfo *msginfo;
- IMAPSession *session;
- gint ok = IMAP_SUCCESS;
-
- g_return_val_if_fail(folder != NULL, -1);
- g_return_val_if_fail(dest != NULL, -1);
- g_return_val_if_fail(msglist != NULL, -1);
-
- session = imap_session_get(folder);
- if (!session) return -1;
-
- destdir = imap_get_real_path(IMAP_FOLDER(folder), dest->path);
-
- for (cur = msglist; cur != NULL; cur = cur->next) {
- msginfo = (MsgInfo *)cur->data;
-
- if (msginfo->folder == dest) {
- g_warning("the src folder is identical to the dest.\n");
- continue;
- }
-
- /* ensure source folder selected */
- ok = imap_select(session, IMAP_FOLDER(folder),
- msginfo->folder->path, NULL, NULL, NULL, NULL);
-
- if (remove_source)
- debug_print("Moving message %s%c%d to %s ...\n",
- msginfo->folder->path, G_DIR_SEPARATOR,
- msginfo->msgnum, destdir);
- else
- debug_print("Copying message %s%c%d to %s ...\n",
- msginfo->folder->path, G_DIR_SEPARATOR,
- msginfo->msgnum, destdir);
-
- ok = imap_cmd_copy(session, msginfo, destdir);
-
- if (ok == IMAP_SUCCESS && remove_source) {
- imap_set_message_flags
- (session, msginfo->msgnum, msginfo->msgnum,
- IMAP_FLAG_DELETED, TRUE);
- }
- }
-
- if (remove_source)
- ok = imap_cmd_expunge(SESSION(session)->sock);
-
- g_free(destdir);
-
- if (ok == IMAP_SUCCESS)
- return 0;
- else
- return -1;
-}
-#endif
-
-gint imap_move_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
-{
- gchar *srcfile;
- gint ret = 0;
-
- g_return_val_if_fail(folder != NULL, -1);
- g_return_val_if_fail(dest != NULL, -1);
- g_return_val_if_fail(msginfo != NULL, -1);
- g_return_val_if_fail(msginfo->folder != NULL, -1);
-
- if (folder == msginfo->folder->folder)
- return imap_do_copy(folder, dest, msginfo, TRUE);
-
- srcfile = procmsg_get_message_file(msginfo);
- if (!srcfile) return -1;
-
- ret = imap_add_msg(folder, dest, srcfile, FALSE);
- g_free(srcfile);
-
- if (ret != -1) {
- if(folder_item_remove_msg(msginfo->folder, msginfo->msgnum)) {
- ret = -1;
- }
- }
-
- return ret;
-}
-
-#if 0
-gint imap_move_msgs_with_dest(Folder *folder, FolderItem *dest,
- GSList *msglist)
-{
- MsgInfo *msginfo;
- GSList *cur;
- gint ret = 0;
-
- g_return_val_if_fail(folder != NULL, -1);
- g_return_val_if_fail(dest != NULL, -1);
- g_return_val_if_fail(msglist != NULL, -1);
-
- msginfo = (MsgInfo *)msglist->data;
- if (folder == msginfo->folder->folder)
- return imap_do_copy_msgs_with_dest(folder, dest, msglist, TRUE);
-
- for (cur = msglist; cur != NULL; cur = cur->next) {
- msginfo = (MsgInfo *)cur->data;
- ret = imap_move_msg(folder, dest, msginfo);
- if (ret == -1) break;
- }
-
- return ret;
-}
-#endif
-
gint imap_copy_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
{
gchar *srcfile;
return ret;
}
-#if 0
-gint imap_copy_msgs_with_dest(Folder *folder, FolderItem *dest,
- GSList *msglist)
-{
- MsgInfo *msginfo;
- GSList *cur;
- gint ret = 0;
-
- g_return_val_if_fail(folder != NULL, -1);
- g_return_val_if_fail(dest != NULL, -1);
- g_return_val_if_fail(msglist != NULL, -1);
-
- msginfo = (MsgInfo *)msglist->data;
- if (folder == msginfo->folder->folder)
- return imap_do_copy_msgs_with_dest
- (folder, dest, msglist, FALSE);
-
- for (cur = msglist; cur != NULL; cur = cur->next) {
- msginfo = (MsgInfo *)cur->data;
- ret = imap_copy_msg(folder, dest, msginfo);
- if (ret == -1) break;
- }
-
- return ret;
-}
-#endif
-
gint imap_remove_msg(Folder *folder, FolderItem *item, gint uid)
{
gint ok;
return IMAP_SUCCESS;
}
-gint imap_remove_msgs(Folder *folder, FolderItem *item, GSList *msglist)
-{
- gint ok;
- IMAPSession *session;
- gchar *dir;
- MsgInfo *msginfo;
- GSList *cur;
- guint32 uid;
-
- g_return_val_if_fail(folder != NULL, -1);
- g_return_val_if_fail(FOLDER_CLASS(folder) == &imap_class, -1);
- g_return_val_if_fail(item != NULL, -1);
- g_return_val_if_fail(msglist != NULL, -1);
-
- session = imap_session_get(folder);
- if (!session) return -1;
-
- ok = imap_select(session, IMAP_FOLDER(folder), item->path,
- NULL, NULL, NULL, NULL);
- if (ok != IMAP_SUCCESS)
- return ok;
-
- for (cur = msglist; cur != NULL; cur = cur->next) {
- msginfo = (MsgInfo *)cur->data;
- uid = msginfo->msgnum;
- ok = imap_set_message_flags
- (IMAP_SESSION(REMOTE_FOLDER(folder)->session),
- uid, uid, IMAP_FLAG_DELETED, TRUE);
- if (ok != IMAP_SUCCESS) {
- log_warning(_("can't set deleted flags: %d\n"), uid);
- return ok;
- }
- }
-
- ok = imap_cmd_expunge(SESSION(session)->sock);
- if (ok != IMAP_SUCCESS) {
- log_warning(_("can't expunge\n"));
- return ok;
- }
-
- dir = folder_item_get_path(item);
- if (is_dir_exist(dir)) {
- for (cur = msglist; cur != NULL; cur = cur->next) {
- msginfo = (MsgInfo *)cur->data;
- uid = msginfo->msgnum;
- remove_numbered_files(dir, uid, uid);
- }
- }
- g_free(dir);
-
- return IMAP_SUCCESS;
-}
-
gint imap_remove_all_msg(Folder *folder, FolderItem *item)
{
gint exists, recent, unseen;
return msginfo;
}
-gint imap_msg_set_perm_flags(MsgInfo *msginfo, MsgPermFlags flags)
-{
- Folder *folder;
- IMAPSession *session;
- IMAPFlags iflags = 0;
- gint ok = IMAP_SUCCESS;
-
- g_return_val_if_fail(msginfo != NULL, -1);
- g_return_val_if_fail(msginfo->folder != NULL, -1);
- g_return_val_if_fail(msginfo->folder->folder != NULL, -1);
-
- folder = msginfo->folder->folder;
- g_return_val_if_fail(FOLDER_CLASS(folder) == &imap_class, -1);
-
- session = imap_session_get(folder);
- if (!session) return -1;
-
- if ((ok = imap_select(session, IMAP_FOLDER(folder), msginfo->folder->path,
- NULL, NULL, NULL, NULL)) != IMAP_SUCCESS)
- return ok;
-
- if (flags & MSG_MARKED) iflags |= IMAP_FLAG_FLAGGED;
- if (flags & MSG_REPLIED) iflags |= IMAP_FLAG_ANSWERED;
- if (iflags) {
- ok = imap_set_message_flags(session, msginfo->msgnum,
- msginfo->msgnum, iflags, TRUE);
- if (ok != IMAP_SUCCESS) return ok;
- }
-
- if (flags & MSG_UNREAD)
- ok = imap_set_message_flags(session, msginfo->msgnum,
- msginfo->msgnum, IMAP_FLAG_SEEN,
- FALSE);
- return ok;
-}
-
-gint imap_msg_unset_perm_flags(MsgInfo *msginfo, MsgPermFlags flags)
-{
- Folder *folder;
- IMAPSession *session;
- IMAPFlags iflags = 0;
- gint ok = IMAP_SUCCESS;
-
- g_return_val_if_fail(msginfo != NULL, -1);
- g_return_val_if_fail(msginfo->folder != NULL, -1);
- g_return_val_if_fail(msginfo->folder->folder != NULL, -1);
-
- folder = msginfo->folder->folder;
- g_return_val_if_fail(FOLDER_CLASS(folder) == &imap_class, -1);
-
- session = imap_session_get(folder);
- if (!session) return -1;
-
- if (flags & MSG_MARKED) iflags |= IMAP_FLAG_FLAGGED;
- if (flags & MSG_REPLIED) iflags |= IMAP_FLAG_ANSWERED;
- if (iflags) {
- ok = imap_set_message_flags(session, msginfo->msgnum,
- msginfo->msgnum, iflags, FALSE);
- if (ok != IMAP_SUCCESS) return ok;
- }
-
- if (flags & MSG_UNREAD)
- ok = imap_set_message_flags(session, msginfo->msgnum,
- msginfo->msgnum, IMAP_FLAG_SEEN,
- TRUE);
- return ok;
-}
-
static gint imap_set_message_flags(IMAPSession *session,
guint32 first_uid,
guint32 last_uid,
return;
}
+
#define IMAP_IS_DRAFT(flags) ((flags & IMAP_FLAG_DRAFT) != 0)
FolderClass *imap_get_class ();
-Folder *imap_folder_new (const gchar *name,
- const gchar *path);
-void imap_folder_destroy (Folder *folder);
-
-Session *imap_session_new (const PrefsAccount *account);
-void imap_session_authenticate (IMAPSession *session,
- const PrefsAccount *account);
-void imap_session_destroy (Session *session);
-void imap_session_destroy_all (void);
-
-GSList *imap_get_msg_list (Folder *folder,
- FolderItem *item,
- gboolean use_cache);
-gchar *imap_fetch_msg (Folder *folder,
- FolderItem *item,
- gint uid);
-gint imap_add_msg (Folder *folder,
- FolderItem *dest,
- const gchar *file,
- gboolean remove_source);
-
-gint imap_move_msg (Folder *folder,
- FolderItem *dest,
- MsgInfo *msginfo);
-gint imap_move_msgs_with_dest (Folder *folder,
- FolderItem *dest,
- GSList *msglist);
-gint imap_copy_msg (Folder *folder,
- FolderItem *dest,
- MsgInfo *msginfo);
-gint imap_copy_msgs_with_dest (Folder *folder,
- FolderItem *dest,
- GSList *msglist);
-
-gint imap_remove_msg (Folder *folder,
- FolderItem *item,
- gint uid);
-gint imap_remove_msgs (Folder *folder,
- FolderItem *item,
- GSList *msglist);
-gint imap_remove_all_msg (Folder *folder,
- FolderItem *item);
-
-gboolean imap_is_msg_changed (Folder *folder,
- FolderItem *item,
- MsgInfo *msginfo);
-
-gint imap_scan_folder (Folder *folder,
- FolderItem *item);
-void imap_scan_tree (Folder *folder);
-
-gint imap_create_tree (Folder *folder);
-
-FolderItem *imap_create_folder (Folder *folder,
- FolderItem *parent,
- const gchar *name);
-gint imap_rename_folder (Folder *folder,
- FolderItem *item,
- const gchar *name);
-gint imap_remove_folder (Folder *folder,
- FolderItem *item);
-
-gint imap_msg_set_perm_flags (MsgInfo *msginfo,
- MsgPermFlags flags);
-gint imap_msg_unset_perm_flags (MsgInfo *msginfo,
- MsgPermFlags flags);
#endif /* __IMAP_H__ */
#define MSGBUFSIZE 8192
+static Folder *mbox_folder_new(const gchar * name, const gchar * path);
+static void mbox_folder_destroy(Folder * folder);
+
+static gchar *mbox_fetch_msg(Folder * folder, FolderItem * item, gint num);
+
+static void mbox_scan_folder(Folder * folder, FolderItem * item);
+static gint mbox_add_msg(Folder * folder, FolderItem * dest,
+ const gchar * file, gboolean remove_source);
+
+static gint mbox_remove_all_msg(Folder * folder, FolderItem * item);
+static gint mbox_remove_msg(Folder * folder, FolderItem * item, gint num);
+static void mbox_change_flags(Folder * folder, FolderItem * item,
+ MsgInfo * info, MsgPermFlags newflags);
+static gint mbox_copy_msg(Folder * folder, FolderItem * dest,
+ MsgInfo * msginfo);
+static gint mbox_create_tree(Folder * folder);
+static FolderItem *mbox_create_folder(Folder * folder, FolderItem * parent,
+ const gchar * name);
+static gint mbox_rename_folder(Folder * folder, FolderItem * item,
+ const gchar * name);
+static gint mbox_remove_folder(Folder * folder, FolderItem * item);
+
static void mbox_folder_init (Folder *folder,
const gchar *name,
const gchar *path);
static gboolean mbox_write_data(FILE * mbox_fp, FILE * new_fp,
gchar * new_filename, gint size);
-static gboolean mbox_rewrite(gchar * mbox);
static gboolean mbox_purge_deleted(gchar * mbox);
static gchar * mbox_get_new_path(FolderItem * parent, gchar * name);
static gchar * mbox_get_folderitem_name(gchar * name);
-MsgInfo *mbox_get_msginfo(Folder *folder, FolderItem *item, gint num);
-gint mbox_get_num_list(Folder *folder, FolderItem *item, GSList **list);
-gboolean mbox_check_msgnum_validity(Folder *folder, FolderItem *item);
+static MsgInfo *mbox_get_msginfo(Folder *folder, FolderItem *item, gint num);
+static gint mbox_get_num_list(Folder *folder, FolderItem *item, GSList **list);
+static gboolean mbox_check_msgnum_validity(Folder *folder, FolderItem *item);
FolderClass mbox_class =
{
NULL,
mbox_fetch_msg,
mbox_add_msg,
- NULL,
- NULL,
mbox_copy_msg,
- NULL,
mbox_remove_msg,
- NULL,
mbox_remove_all_msg,
NULL,
- NULL,
+ mbox_change_flags,
};
FolderClass *mbox_get_class()
/* */
/**********************************************************/
-
-GSList *mbox_get_msg_list(Folder *folder, FolderItem *item, gboolean use_cache)
-{
- GSList *mlist;
- MsgInfo * msginfo;
- GList * l;
- FILE * fp;
- gchar * mbox_path;
-
-#ifdef MEASURE_TIME
- struct timeval tv_before, tv_after, tv_result;
-
- gettimeofday(&tv_before, NULL);
-#endif
-
- mlist = NULL;
-
- mbox_path = mbox_folder_get_path(item);
-
- if (mbox_path == NULL)
- return NULL;
-
- mbox_purge_deleted(mbox_path);
-
- fp = fopen(mbox_path, "rb");
-
- if (fp == NULL) {
- g_free(mbox_path);
- return NULL;
- }
-
- mbox_lockread_file(fp, mbox_path);
-
- mbox_cache_synchronize_from_file(fp, mbox_path, TRUE);
-
- item->last_num = mbox_cache_get_count(mbox_path);
-
- for(l = mbox_cache_get_msg_list(mbox_path) ; l != NULL ;
- l = g_list_next(l)) {
- struct _message * msg;
-
- msg = (struct _message *) l->data;
-
- if (MSG_IS_INVALID(msg->flags) || !MSG_IS_REALLY_DELETED(msg->flags)) {
- fseek(fp, msg->header, SEEK_SET);
-
- msginfo = mbox_parse_msg(fp, msg, item);
-
- if (!MSG_IS_INVALID(msg->flags))
- msginfo->flags = msg->flags;
- else {
- msg->old_flags = msginfo->flags;
- msg->flags = msginfo->flags;
- }
-
- mlist = g_slist_append(mlist, msginfo);
- }
- else {
- MSG_SET_PERM_FLAGS(msg->flags, MSG_REALLY_DELETED);
- }
- }
-
- mbox_unlock_file(fp, mbox_path);
-
- g_free(mbox_path);
-
- fclose(fp);
-
-#ifdef MEASURE_TIME
- gettimeofday(&tv_after, NULL);
-
- timersub(&tv_after, &tv_before, &tv_result);
- g_print("mbox_get_msg_list: %s: elapsed time: %ld.%06ld sec\n",
- mbox_path, tv_result.tv_sec, tv_result.tv_usec);
-#endif
-
- return mlist;
-}
-
static gboolean mbox_extract_msg(FolderItem * item, gint msgnum,
gchar * dest_filename)
{
return num;
}
-void mbox_finished_copy(Folder *folder, FolderItem *dest)
-{
- gchar * mbox_path;
- GSList * l;
- mboxcache * cache;
-
- mbox_path = mbox_folder_get_path(dest);
- if (mbox_path == NULL)
- return;
-
- mbox_cache_synchronize(mbox_path, TRUE);
-
- for(l = copy_flags_data ; l != NULL ; l = g_slist_next(l)) {
- CopyFlagsInfo * flags_info = l->data;
- struct _message * msg;
-
- msg = mbox_cache_get_msg(mbox_path, flags_info->num);
- if (msg != NULL)
- msg->flags = flags_info->flags;
- g_free(flags_info);
- }
-
- if (copy_flags_data != NULL) {
- cache = mbox_cache_get_mbox(mbox_path);
- cache->modification = TRUE;
- }
-
- g_slist_free(copy_flags_data);
- copy_flags_data = NULL;
-
- mbox_rewrite(mbox_path);
-
- g_free(mbox_path);
-}
-
void mbox_scan_folder(Folder *folder, FolderItem *item)
{
gchar *mbox_path;
return mbox_write_data(mbox_fp, new_fp, new_filename, size);
}
-void mbox_update_mark(Folder * folder, FolderItem * item)
-{
- gchar * mbox_path;
-
- mbox_path = mbox_folder_get_path(item);
- if (mbox_path == NULL)
- return;
-
- mbox_rewrite(mbox_path);
- g_free(mbox_path);
-}
-
-void mbox_change_flags(Folder * folder, FolderItem * item, MsgInfo * info)
+void mbox_change_flags(Folder * folder, FolderItem * item, MsgInfo * info, MsgPermFlags newflags)
{
struct _message * msg;
mboxcache * cache;
if (mbox_path == NULL)
return;
+ info->flags.perm_flags = newflags;
+
msg = mbox_cache_get_msg(mbox_path, info->msgnum);
cache = mbox_cache_get_mbox(mbox_path);
msg->flags = info->flags;
- cache->modification = TRUE;
-
+ cache->modification = TRUE;
}
-static gboolean mbox_rewrite(gchar * mbox)
-{
- FILE * mbox_fp;
- FILE * new_fp;
- gchar * new;
- GList * l;
- gboolean result;
- GList * msg_list;
- gint count;
- mboxcache * cache;
-
- msg_list = mbox_cache_get_msg_list(mbox);
-
- cache = mbox_cache_get_mbox(mbox);
- if (cache == NULL)
- return FALSE;
-
- if (!cache->modification) {
- debug_print("no modification - %s\n", mbox);
- return FALSE;
- }
-
- debug_print("save modification - %s\n", mbox);
-
- mbox_fp = fopen(mbox, "rb+");
- mbox_lockwrite_file(mbox_fp, mbox);
-
- mbox_cache_synchronize_from_file(mbox_fp, mbox, TRUE);
-
- new = g_strconcat(mbox, ".", itos((int) mbox), NULL);
- new_fp = fopen(new, "wb");
-
- if (change_file_mode_rw(new_fp, new) < 0) {
- FILE_OP_ERROR(new, "chmod");
- g_warning("can't change file mode\n");
- }
-
- mbox_lockwrite_file(new_fp, new);
-
- result = TRUE;
-
- count = 0;
- msg_list = mbox_cache_get_msg_list(mbox);
- for(l = msg_list ; l != NULL ; l = g_list_next(l)) {
- struct _message * msg = (struct _message *) l->data;
- if (!mbox_write_message(mbox_fp, new_fp, new, msg)) {
- result = FALSE;
- break;
- }
- count ++;
- }
-
- unlink(mbox);
-
- if (rename(new, mbox) == -1) {
- g_warning("can't rename %s to %s\n", new, mbox);
- mbox_unlock_file(new_fp, new);
- fclose(new_fp);
- mbox_unlock_file(mbox_fp, mbox);
- fclose(mbox_fp);
- g_free(new);
- return -1;
- }
-
- if (change_file_mode_rw(new_fp, mbox) < 0) {
- FILE_OP_ERROR(new, "chmod");
- g_warning("can't change file mode\n");
- }
-
- mbox_unlock_file(new_fp, new);
-
- fclose(new_fp);
-
- mbox_unlock_file(mbox_fp, mbox);
-
- fclose(mbox_fp);
-
- debug_print("%i messages written - %s\n", count, mbox);
-
- cache = mbox_cache_get_mbox(mbox);
-
- if (cache != NULL)
- cache->mtime = -1;
-
- mbox_cache_synchronize(mbox, FALSE);
-
- g_free(new);
-
- return result;
-}
-
static gboolean mbox_purge_deleted(gchar * mbox)
{
FILE * mbox_fp;
};
FolderClass *mbox_get_class ();
-Folder *mbox_folder_new (const gchar *name,
- const gchar *path);
-void mbox_folder_destroy (Folder *folder);
-
-
-GSList *mbox_get_msg_list(Folder *folder, FolderItem *item, gboolean use_cache);
-gchar *mbox_fetch_msg(Folder *folder, FolderItem *item, gint num);
-
-void mbox_scan_folder(Folder *folder, FolderItem *item);
gchar * mbox_get_virtual_path(FolderItem * item);
-gint mbox_add_msg(Folder *folder, FolderItem *dest, const gchar *file,
- gboolean remove_source);
-
-gint mbox_remove_all_msg(Folder *folder, FolderItem *item);
-gint mbox_remove_msg(Folder *folder, FolderItem *item, gint num);
-void mbox_update_mark(Folder * folder, FolderItem * item);
-gint mbox_move_msgs_with_dest(Folder *folder, FolderItem *dest,
- GSList *msglist);
-gint mbox_move_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo);
-void mbox_change_flags(Folder * folder, FolderItem * item, MsgInfo * info);
-gint mbox_copy_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo);
-gint mbox_copy_msgs_with_dest(Folder *folder, FolderItem *dest, GSList *msglist);
-gint mbox_create_tree(Folder *folder);
-FolderItem *mbox_create_folder(Folder *folder, FolderItem *parent,
- const gchar *name);
-gint mbox_rename_folder(Folder *folder, FolderItem *item, const gchar *name);
-gint mbox_remove_folder(Folder *folder, FolderItem *item);
-void mbox_finished_copy(Folder *folder, FolderItem *dest);
-
#endif
#include "procheader.h"
#include "utils.h"
-static void mh_folder_init (Folder *folder,
- const gchar *name,
- const gchar *path);
-
-GSList *mh_get_msg_list (Folder *folder,
- FolderItem *item,
- gboolean use_cache);
-gchar *mh_fetch_msg (Folder *folder,
- FolderItem *item,
- gint num);
-MsgInfo *mh_get_msginfo (Folder *folder,
- FolderItem *item,
- gint num);
-gint mh_add_msg (Folder *folder,
- FolderItem *dest,
- const gchar *file,
- gboolean remove_source);
-gint mh_move_msg (Folder *folder,
- FolderItem *dest,
- MsgInfo *msginfo);
-gint mh_move_msgs_with_dest (Folder *folder,
- FolderItem *dest,
- GSList *msglist);
-gint mh_copy_msg (Folder *folder,
- FolderItem *dest,
- MsgInfo *msginfo);
-gint mh_copy_msgs_with_dest (Folder *folder,
- FolderItem *dest,
- GSList *msglist);
-gint mh_remove_msg (Folder *folder,
- FolderItem *item,
- gint num);
-gint mh_remove_all_msg (Folder *folder,
- FolderItem *item);
-gboolean mh_is_msg_changed (Folder *folder,
- FolderItem *item,
- MsgInfo *msginfo);
-
-gint mh_scan_folder (Folder *folder,
- FolderItem *item);
-gint mh_get_num_list (Folder *folder,
- FolderItem *item,
- GSList **list);
-void mh_scan_tree (Folder *folder);
-
-gint mh_create_tree (Folder *folder);
-FolderItem *mh_create_folder (Folder *folder,
- FolderItem *parent,
- const gchar *name);
-gint mh_rename_folder (Folder *folder,
- FolderItem *item,
- const gchar *name);
-gint mh_remove_folder (Folder *folder,
- FolderItem *item);
-
-gchar *mh_get_new_msg_filename (FolderItem *dest);
-
-static MsgInfo *mh_parse_msg (const gchar *file,
- FolderItem *item);
-static void mh_scan_tree_recursive (FolderItem *item);
-
-static gboolean mh_rename_folder_func (GNode *node,
- gpointer data);
+static void mh_folder_init(Folder * folder,
+ const gchar * name, const gchar * path);
+
+static Folder *mh_folder_new(const gchar * name, const gchar * path);
+static void mh_folder_destroy(Folder * folder);
+static gchar *mh_fetch_msg(Folder * folder, FolderItem * item, gint num);
+static MsgInfo *mh_get_msginfo(Folder * folder,
+ FolderItem * item, gint num);
+static gint mh_add_msg(Folder * folder,
+ FolderItem * dest,
+ const gchar * file, gboolean remove_source);
+static gint mh_copy_msg(Folder * folder,
+ FolderItem * dest, MsgInfo * msginfo);
+static gint mh_remove_msg(Folder * folder, FolderItem * item, gint num);
+static gint mh_remove_all_msg(Folder * folder, FolderItem * item);
+static gboolean mh_is_msg_changed(Folder * folder,
+ FolderItem * item, MsgInfo * msginfo);
+
+static gint mh_get_num_list(Folder * folder,
+ FolderItem * item, GSList ** list);
+static void mh_scan_tree(Folder * folder);
+
+static gint mh_create_tree(Folder * folder);
+static FolderItem *mh_create_folder(Folder * folder,
+ FolderItem * parent,
+ const gchar * name);
+static gint mh_rename_folder(Folder * folder,
+ FolderItem * item, const gchar * name);
+static gint mh_remove_folder(Folder * folder, FolderItem * item);
+
+static gchar *mh_get_new_msg_filename(FolderItem * dest);
+
+static MsgInfo *mh_parse_msg(const gchar * file, FolderItem * item);
+static void mh_scan_tree_recursive(FolderItem * item);
+
+static gboolean mh_rename_folder_func(GNode * node, gpointer data);
FolderClass mh_class =
NULL,
mh_fetch_msg,
mh_add_msg,
- mh_move_msg,
- mh_move_msgs_with_dest,
mh_copy_msg,
- mh_copy_msgs_with_dest,
mh_remove_msg,
- NULL,
mh_remove_all_msg,
mh_is_msg_changed,
NULL,
return dest->last_num;
}
-static gint mh_do_move(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
-{
- gchar *srcfile;
- gchar *destfile;
- gint filemode = 0;
- PrefsFolderItem *prefs;
-
- g_return_val_if_fail(dest != NULL, -1);
- g_return_val_if_fail(msginfo != NULL, -1);
-
- if (msginfo->folder == dest) {
- g_warning("the src folder is identical to the dest.\n");
- return -1;
- }
-
- if (dest->last_num < 0) {
- mh_get_last_num(folder, dest);
- if (dest->last_num < 0) return -1;
- }
-
- prefs = dest->prefs;
-
- destfile = mh_get_new_msg_filename(dest);
- if (!destfile) return -1;
-
- srcfile = procmsg_get_message_file(msginfo);
-
- debug_print("Moving message %s%c%d to %s ...\n",
- msginfo->folder->path, G_DIR_SEPARATOR,
- msginfo->msgnum, dest->path);
-
- if (move_file(srcfile, destfile, FALSE) < 0) {
- g_free(srcfile);
- g_free(destfile);
- return -1;
- }
-
- if (prefs && prefs->enable_folder_chmod && prefs->folder_chmod) {
- if (chmod(destfile, prefs->folder_chmod) < 0)
- FILE_OP_ERROR(destfile, "chmod");
-
- /* for mark file */
- filemode = prefs->folder_chmod;
- if (filemode & S_IRGRP) filemode |= S_IWGRP;
- if (filemode & S_IROTH) filemode |= S_IWOTH;
- }
-
- g_free(srcfile);
- g_free(destfile);
- dest->last_num++;
-
- return dest->last_num;
-}
-
-gint mh_move_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
-{
- gchar *srcfile;
- gint ret = 0;
-
- g_return_val_if_fail(folder != NULL, -1);
- g_return_val_if_fail(dest != NULL, -1);
- g_return_val_if_fail(msginfo != NULL, -1);
- g_return_val_if_fail(msginfo->folder != NULL, -1);
-
- if (folder == msginfo->folder->folder)
- return mh_do_move(folder, dest, msginfo);
-
- srcfile = procmsg_get_message_file(msginfo);
- if (!srcfile) return -1;
-
- ret = mh_add_msg(folder, dest, srcfile, FALSE);
- g_free(srcfile);
-
- if (ret != -1)
- ret = folder_item_remove_msg(msginfo->folder, msginfo->msgnum);
-
- return ret;
-}
-
-static gint mh_do_move_msgs_with_dest(Folder *folder, FolderItem *dest,
- GSList *msglist)
-{
- gchar *srcfile;
- gchar *destfile;
- GSList *cur;
- MsgInfo *msginfo;
- PrefsFolderItem *prefs;
-
- g_return_val_if_fail(dest != NULL, -1);
- g_return_val_if_fail(msglist != NULL, -1);
-
- if (dest->last_num < 0) {
- mh_get_last_num(folder, dest);
- if (dest->last_num < 0) return -1;
- }
-
- prefs = dest->prefs;
-
- for (cur = msglist; cur != NULL; cur = cur->next) {
- msginfo = (MsgInfo *)cur->data;
-
- if (msginfo->folder == dest) {
- g_warning("the src folder is identical to the dest.\n");
- continue;
- }
- debug_print("Moving message %s%c%d to %s ...\n",
- msginfo->folder->path, G_DIR_SEPARATOR,
- msginfo->msgnum, dest->path);
-
- destfile = mh_get_new_msg_filename(dest);
- if (!destfile) return -1;
- srcfile = procmsg_get_message_file(msginfo);
-
- if (move_file(srcfile, destfile, FALSE) < 0) {
- g_free(srcfile);
- g_free(destfile);
- break;
- }
-
- g_free(srcfile);
- g_free(destfile);
- dest->last_num++;
- }
-
- return dest->last_num;
-}
-
-gint mh_move_msgs_with_dest(Folder *folder, FolderItem *dest, GSList *msglist)
-{
- MsgInfo *msginfo;
- GSList *cur;
- gint ret = 0;
-
- msginfo = (MsgInfo *)msglist->data;
- if (folder == msginfo->folder->folder)
- return mh_do_move_msgs_with_dest(folder, dest, msglist);
-
- for (cur = msglist; cur != NULL; cur = cur->next) {
- msginfo = (MsgInfo *)cur->data;
- ret = mh_move_msg(folder, dest, msginfo);
- if (ret == -1) break;
- }
-
- return ret;
-}
-
gint mh_copy_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
{
gchar *srcfile;
return dest->last_num;
}
-/*
-gint mh_copy_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
-{
- Folder * src_folder;
- gchar * filename;
- gint num;
- gchar * destdir;
- FILE * fp;
-
- src_folder = msginfo->folder->folder;
-
- g_return_val_if_fail(src_folder->fetch_msg != NULL, -1);
-
- filename = src_folder->fetch_msg(src_folder,
- msginfo->folder,
- msginfo->msgnum);
- if (filename == NULL)
- return -1;
-
- num = folder->add_msg(folder, dest, filename, FALSE);
-
- destdir = folder_item_get_path(dest);
-
- if (fp) {
- MsgInfo newmsginfo;
-
- newmsginfo.msgnum = dest->last_num;
- newmsginfo.flags = msginfo->flags;
- if (dest->stype == F_OUTBOX ||
- dest->stype == F_QUEUE ||
- dest->stype == F_DRAFT ||
- dest->stype == F_TRASH)
- MSG_UNSET_FLAGS(newmsginfo.flags,
- MSG_NEW|MSG_UNREAD|MSG_DELETED);
-
- procmsg_write_flags(&newmsginfo, fp);
- fclose(fp);
- }
-
- return num;
-}
-*/
-
-gint mh_copy_msgs_with_dest(Folder *folder, FolderItem *dest, GSList *msglist)
-{
- gchar *srcfile;
- gchar *destfile;
- GSList *cur;
- MsgInfo *msginfo;
-
- g_return_val_if_fail(dest != NULL, -1);
- g_return_val_if_fail(msglist != NULL, -1);
-
- if (dest->last_num < 0) {
- mh_get_last_num(folder, dest);
- if (dest->last_num < 0) return -1;
- }
-
- for (cur = msglist; cur != NULL; cur = cur->next) {
- msginfo = (MsgInfo *)cur->data;
-
- if (msginfo->folder == dest) {
- g_warning("the src folder is identical to the dest.\n");
- continue;
- }
- debug_print("Copying message %s%c%d to %s ...\n",
- msginfo->folder->path, G_DIR_SEPARATOR,
- msginfo->msgnum, dest->path);
-
- destfile = mh_get_new_msg_filename(dest);
- if (!destfile) break;
- srcfile = procmsg_get_message_file(msginfo);
-
- if (copy_file(srcfile, destfile, TRUE) < 0) {
- FILE_OP_ERROR(srcfile, "copy");
- g_free(srcfile);
- g_free(destfile);
- break;
- }
-
- g_free(srcfile);
- g_free(destfile);
- dest->last_num++;
- }
-
- return dest->last_num;
-}
-
gint mh_remove_msg(Folder *folder, FolderItem *item, gint num)
{
gchar *file;
return FALSE;
}
-gint mh_scan_folder(Folder *folder, FolderItem *item)
-{
- gchar *path;
- DIR *dp;
- struct dirent *d;
- struct stat s;
- gint max = 0;
- gint num;
-
- g_return_val_if_fail(item != NULL, -1);
-
- debug_print("mh_scan_folder(): Scanning %s ...\n", item->path);
-
- path = folder_item_get_path(item);
- g_return_val_if_fail(path != NULL, -1);
- if (change_dir(path) < 0) {
- g_free(path);
- return -1;
- }
- g_free(path);
-
- if ((dp = opendir(".")) == NULL) {
- FILE_OP_ERROR(item->path, "opendir");
- return -1;
- }
-
- if (folder->ui_func)
- folder->ui_func(folder, item, folder->ui_func_data);
-
- while ((d = readdir(dp)) != NULL) {
- if ((num = to_number(d->d_name)) >= 0 &&
- stat(d->d_name, &s) == 0 &&
- S_ISREG(s.st_mode)) {
-/*
- n_msg++;
-*/
- if (max < num)
- max = num;
- }
- }
- closedir(dp);
-
-/*
- if (n_msg == 0)
- item->new = item->unread = item->total = 0;
- else {
- gint new, unread, total, min, max;
-
- procmsg_get_mark_sum(".", &new, &unread, &total, &min, &max, 0);
- if (n_msg > total) {
- new += n_msg - total;
- unread += n_msg - total;
- }
- item->new = new;
- item->unread = unread;
- item->total = n_msg;
- }
-*/
- debug_print("Last number in dir %s = %d\n", item->path, max);
- item->last_num = max;
-
- return 0;
-}
-
void mh_scan_tree(Folder *folder)
{
FolderItem *item;
};
FolderClass *mh_get_class ();
-Folder *mh_folder_new (const gchar *name,
- const gchar *path);
-void mh_folder_destroy (Folder *folder);
#endif /* __MH_H__ */
#define NNTPS_PORT 563
#endif
+static Folder *news_folder_new(const gchar * name, const gchar * folder);
+static void news_folder_destroy(Folder * folder);
+
+static gchar *news_fetch_msg(Folder * folder, FolderItem * item, gint num);
+
+static gint news_scan_group(Folder * folder, FolderItem * item);
+
static void news_folder_init (Folder *folder,
const gchar *name,
const gchar *path);
NULL,
NULL,
NULL,
- news_remove_msg,
- NULL,
- NULL,
- NULL,
NULL,
};
};
FolderClass *news_get_class ();
-Folder *news_folder_new (const gchar *name,
- const gchar *folder);
-void news_folder_destroy (Folder *folder);
+gint news_post (Folder * folder,
+ const gchar * file);
-GSList *news_get_article_list (Folder *folder,
- FolderItem *item,
- gboolean use_cache);
-gchar *news_fetch_msg (Folder *folder,
- FolderItem *item,
- gint num);
+GSList *news_get_group_list (Folder * folder);
+void news_group_list_free (GSList * group_list);
+void news_remove_group_list_cache (Folder * folder);
-gint news_scan_group (Folder *folder,
- FolderItem *item);
-
-GSList *news_get_group_list (Folder *folder);
-void news_group_list_free (GSList *group_list);
-void news_remove_group_list_cache (Folder *folder);
-
-gint news_post (Folder *folder,
- const gchar *file);
-
-gint news_cancel_article (Folder *folder,
- MsgInfo *msginfo);
+gint news_cancel_article (Folder * folder,
+ MsgInfo * msginfo);
#endif /* __NEWS_H__ */
static gchar *summary_complete_address(const gchar *addr)
{
- gint count;
gchar *res, *tmp, *email_addr;
Xstrdup_a(email_addr, addr, return NULL);