diff options
This commit was manufactured by cvs2svn to create tag 'help'.help
svn path=/tags/help/; revision=2234
Diffstat (limited to 'camel/providers/pop3')
-rw-r--r-- | camel/providers/pop3/.cvsignore | 6 | ||||
-rw-r--r-- | camel/providers/pop3/Makefile.am | 28 | ||||
-rw-r--r-- | camel/providers/pop3/camel-pop3-folder.c | 256 | ||||
-rw-r--r-- | camel/providers/pop3/camel-pop3-folder.h | 70 | ||||
-rw-r--r-- | camel/providers/pop3/camel-pop3-provider.c | 54 | ||||
-rw-r--r-- | camel/providers/pop3/camel-pop3-store.c | 453 | ||||
-rw-r--r-- | camel/providers/pop3/camel-pop3-store.h | 80 |
7 files changed, 0 insertions, 947 deletions
diff --git a/camel/providers/pop3/.cvsignore b/camel/providers/pop3/.cvsignore deleted file mode 100644 index 7d926a5545..0000000000 --- a/camel/providers/pop3/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -Makefile -Makefile.in -.libs -.deps -*.lo -*.la diff --git a/camel/providers/pop3/Makefile.am b/camel/providers/pop3/Makefile.am deleted file mode 100644 index c587983ffc..0000000000 --- a/camel/providers/pop3/Makefile.am +++ /dev/null @@ -1,28 +0,0 @@ -## Process this file with automake to produce Makefile.in - -SUBDIRS = - -libcamelpop3includedir = $(includedir)/camel - -providerdir = $(pkglibdir)/camel-providers/$(VERSION) - -provider_LTLIBRARIES = libcamelpop3.la - -INCLUDES = -I.. -I$(srcdir)/.. -I$(includedir) \ - -I$(top_srcdir)/intl \ - $(GTK_INCLUDEDIR) -I$(top_srcdir)/camel \ - -I$(srcdir)/../mbox - -libcamelpop3_la_SOURCES = \ - camel-pop3-folder.c \ - camel-pop3-provider.c \ - camel-pop3-store.c - -libcamelpop3include_HEADERS = \ - camel-pop3-folder.h \ - camel-pop3-store.h - - -libcamelpop3_la_LDFLAGS = -version-info 0:0:0 -rpath $(libdir) - -EXTRA_DIST = diff --git a/camel/providers/pop3/camel-pop3-folder.c b/camel/providers/pop3/camel-pop3-folder.c deleted file mode 100644 index 0b2ccb030b..0000000000 --- a/camel/providers/pop3/camel-pop3-folder.c +++ /dev/null @@ -1,256 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-pop3-folder.c : class for a pop3 folder */ - -/* - * Authors: - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "camel-pop3-folder.h" -#include "camel-pop3-store.h" -#include "camel-exception.h" -#include "camel-stream-mem.h" -#include "camel-mime-message.h" - -#include <stdlib.h> - -#define CF_CLASS(o) (CAMEL_FOLDER_CLASS (GTK_OBJECT (o)->klass)) -static CamelFolderClass *parent_class; - -static void pop3_open (CamelFolder *folder, CamelFolderOpenMode mode, - CamelException *ex); -static void pop3_close (CamelFolder *folder, gboolean expunge, - CamelException *ex); -static gboolean delete_messages (CamelFolder *folder, CamelException *ex); -static gboolean has_message_number_capability (CamelFolder *folder); -static CamelMimeMessage *get_message_by_number (CamelFolder *folder, - gint number, - CamelException *ex); -static void delete_message_by_number (CamelFolder *folder, gint number, - CamelException *ex); -static gint get_message_count (CamelFolder *folder, CamelException *ex); - - -static void -camel_pop3_folder_class_init (CamelPop3FolderClass *camel_pop3_folder_class) -{ - CamelFolderClass *camel_folder_class = - CAMEL_FOLDER_CLASS (camel_pop3_folder_class); - - parent_class = gtk_type_class (camel_folder_get_type ()); - - /* virtual method overload */ - camel_folder_class->open = pop3_open; - camel_folder_class->close = pop3_close; - camel_folder_class->delete_messages = delete_messages; - camel_folder_class->has_message_number_capability = - has_message_number_capability; - camel_folder_class->get_message_by_number = - get_message_by_number; - camel_folder_class->delete_message_by_number = - delete_message_by_number; - camel_folder_class->get_message_count = - get_message_count; -} - - - -static void -camel_pop3_folder_init (gpointer object, gpointer klass) -{ - CamelFolder *folder = CAMEL_FOLDER (object); - - folder->can_hold_messages = TRUE; - folder->can_hold_folders = FALSE; - - /* Hi. I'm CamelPop3Folder. I'm useless. */ - folder->has_summary_capability = FALSE; - folder->has_uid_capability = FALSE; - folder->has_search_capability = FALSE; -} - - - - -GtkType -camel_pop3_folder_get_type (void) -{ - static GtkType camel_pop3_folder_type = 0; - - if (!camel_pop3_folder_type) { - GtkTypeInfo camel_pop3_folder_info = - { - "CamelPop3Folder", - sizeof (CamelPop3Folder), - sizeof (CamelPop3FolderClass), - (GtkClassInitFunc) camel_pop3_folder_class_init, - (GtkObjectInitFunc) camel_pop3_folder_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_pop3_folder_type = gtk_type_unique (CAMEL_FOLDER_TYPE, &camel_pop3_folder_info); - } - - return camel_pop3_folder_type; -} - - -CamelFolder *camel_pop3_folder_new (CamelStore *parent, CamelException *ex) -{ - CamelFolder *folder = - CAMEL_FOLDER (gtk_object_new (camel_pop3_folder_get_type (), - NULL)); - - CF_CLASS (folder)->init (folder, parent, NULL, "inbox", '/', ex); - return folder; -} - -static void -pop3_open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex) -{ - camel_pop3_store_open (CAMEL_POP3_STORE (folder->parent_store), ex); - if (camel_exception_get_id (ex) == CAMEL_EXCEPTION_NONE) - parent_class->open (folder, mode, ex); -} - -static void -pop3_close (CamelFolder *folder, gboolean expunge, CamelException *ex) -{ - camel_pop3_store_close (CAMEL_POP3_STORE (folder->parent_store), - expunge, ex); - if (camel_exception_get_id (ex) == CAMEL_EXCEPTION_NONE) - parent_class->close (folder, expunge, ex); -} - -static gboolean -delete_messages (CamelFolder *folder, CamelException *ex) -{ - int msgs; - gboolean status; - - msgs = get_message_count (folder, ex); - if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) - return FALSE; - - status = TRUE; - for (; msgs > 0; msgs--) { - status = status && - (camel_pop3_command (CAMEL_POP3_STORE (folder->parent_store), - NULL, "DELE %d", msgs) == - CAMEL_POP3_OK); - } - - if (!status) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - "Unable to delete all messages."); - } - - return status; -} - - -static gboolean -has_message_number_capability (CamelFolder *folder) -{ - return TRUE; -} - -static CamelMimeMessage * -get_message_by_number (CamelFolder *folder, gint number, CamelException *ex) -{ - int status; - char *result, *body; - CamelStream *msgstream; - CamelMimeMessage *msg; - - status = camel_pop3_command (CAMEL_POP3_STORE (folder->parent_store), - &result, "RETR %d", number); - if (status != CAMEL_POP3_OK) { - CamelService *service = CAMEL_SERVICE (folder->parent_store); - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - "Could not retrieve message from POP " - "server %s: %s.", service->url->host, - status == CAMEL_POP3_ERR ? result : - "Unknown error"); - g_free (result); - return NULL; - } - g_free (result); - - body = camel_pop3_command_get_additional_data (CAMEL_POP3_STORE (folder->parent_store)); - if (!body) { - CamelService *service = CAMEL_SERVICE (folder->parent_store); - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - "Could not retrieve message from POP " - "server %s.", service->url->host); - return NULL; - } - - msgstream = camel_stream_mem_new_with_buffer (body, strlen (body), - CAMEL_STREAM_MEM_READ); - msg = camel_mime_message_new_with_session (camel_service_get_session (CAMEL_SERVICE (folder->parent_store))); - camel_data_wrapper_set_input_stream (CAMEL_DATA_WRAPPER (msg), - msgstream); - - return msg; -} - -static void -delete_message_by_number (CamelFolder *folder, gint number, CamelException *ex) -{ - int status; - char *resp; - - status = camel_pop3_command (CAMEL_POP3_STORE (folder->parent_store), - &resp, "DELE %d", number); - if (status != CAMEL_POP3_OK) { - camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID, - "Unable to delete message %d%s%s", - number, resp ? ": " : "", - resp ? resp : ""); - } - g_free (resp); -} - -static gint -get_message_count (CamelFolder *folder, CamelException *ex) -{ - int status, count; - char *result; - - status = camel_pop3_command (CAMEL_POP3_STORE (folder->parent_store), - &result, "STAT"); - if (status != CAMEL_POP3_OK) { - CamelService *service = CAMEL_SERVICE (folder->parent_store); - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - "Could not get message count from POP " - "server %s: %s.", service->url->host, - status == CAMEL_POP3_ERR ? result : - "Unknown error"); - g_free (result); - return -1; - } - - count = atoi (result); - g_free (result); - return count; -} diff --git a/camel/providers/pop3/camel-pop3-folder.h b/camel/providers/pop3/camel-pop3-folder.h deleted file mode 100644 index 4199e30ead..0000000000 --- a/camel/providers/pop3/camel-pop3-folder.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-pop3-folder.h : Class for a POP3 folder */ - -/* - * Author: - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_POP3_FOLDER_H -#define CAMEL_POP3_FOLDER_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include "camel-folder.h" - -#define CAMEL_POP3_FOLDER_TYPE (camel_pop3_folder_get_type ()) -#define CAMEL_POP3_FOLDER(obj) (GTK_CHECK_CAST((obj), CAMEL_POP3_FOLDER_TYPE, CamelPop3Folder)) -#define CAMEL_POP3_FOLDER_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_POP3_FOLDER_TYPE, CamelPop3FolderClass)) -#define IS_CAMEL_POP3_FOLDER(o) (GTK_CHECK_TYPE((o), CAMEL_POP3_FOLDER_TYPE)) - - -typedef struct { - CamelFolder parent_object; - -} CamelPop3Folder; - - - -typedef struct { - CamelFolderClass parent_class; - - /* Virtual methods */ - -} CamelPop3FolderClass; - - -/* public methods */ -CamelFolder *camel_pop3_folder_new (CamelStore *parent, CamelException *ex); - -/* Standard Gtk function */ -GtkType camel_pop3_folder_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_POP3_FOLDER_H */ diff --git a/camel/providers/pop3/camel-pop3-provider.c b/camel/providers/pop3/camel-pop3-provider.c deleted file mode 100644 index 0a8c97bbda..0000000000 --- a/camel/providers/pop3/camel-pop3-provider.c +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-pop3-provider.c: pop3 provider registration code */ - -/* - * Authors : - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "config.h" -#include "camel-pop3-store.h" -#include "camel-provider.h" -#include "camel-log.h" - - -static CamelProvider _pop3_provider = { - (GtkType) 0, - PROVIDER_STORE, - PROVIDER_REMOTE, - "POP3", - "Camel default POP3 provider", - "This is a provider that reads from a POP3 server.", - (GModule *) NULL -}; - -CamelProvider * -camel_provider_module_init (void); - - -CamelProvider * -camel_provider_module_init (void) -{ - _pop3_provider.object_type = camel_pop3_store_get_type(); - return &_pop3_provider; -} - - - diff --git a/camel/providers/pop3/camel-pop3-store.c b/camel/providers/pop3/camel-pop3-store.c deleted file mode 100644 index 543a6ce532..0000000000 --- a/camel/providers/pop3/camel-pop3-store.c +++ /dev/null @@ -1,453 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-pop3-store.c : class for a pop3 store */ - -/* - * Authors: - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "config.h" - -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include "camel-pop3-store.h" -#include "camel-pop3-folder.h" -#include "camel-stream-buffer.h" -#include "camel-stream-fs.h" -#include "camel-session.h" -#include "camel-exception.h" -#include "md5-utils.h" -#include "url-util.h" - -/* Specified in RFC 1939 */ -#define POP3_PORT 110 - -static CamelServiceClass *service_class = NULL; - -static void finalize (GtkObject *object); - -static gboolean pop3_connect (CamelService *service, CamelException *ex); -static gboolean pop3_disconnect (CamelService *service, CamelException *ex); -static GList *query_auth_types (CamelService *service); -static void free_auth_types (CamelService *service, GList *authtypes); - -static CamelFolder *get_folder (CamelStore *store, const gchar *folder_name, - CamelException *ex); - - -static void -camel_pop3_store_class_init (CamelPop3StoreClass *camel_pop3_store_class) -{ - GtkObjectClass *object_class = - GTK_OBJECT_CLASS (camel_pop3_store_class); - CamelServiceClass *camel_service_class = - CAMEL_SERVICE_CLASS (camel_pop3_store_class); - CamelStoreClass *camel_store_class = - CAMEL_STORE_CLASS (camel_pop3_store_class); - - service_class = gtk_type_class (camel_service_get_type ()); - - /* virtual method overload */ - object_class->finalize = finalize; - - camel_service_class->connect = pop3_connect; - camel_service_class->disconnect = pop3_disconnect; - camel_service_class->query_auth_types = query_auth_types; - camel_service_class->free_auth_types = free_auth_types; - - camel_store_class->get_root_folder = camel_pop3_folder_new; - camel_store_class->get_default_folder = camel_pop3_folder_new; - camel_store_class->get_folder = get_folder; -} - - - -static void -camel_pop3_store_init (gpointer object, gpointer klass) -{ - CamelService *service = CAMEL_SERVICE (object); - - service->url_flags = ( CAMEL_SERVICE_URL_NEED_USER | - CAMEL_SERVICE_URL_NEED_HOST ); -} - - - - -GtkType -camel_pop3_store_get_type (void) -{ - static GtkType camel_pop3_store_type = 0; - - if (!camel_pop3_store_type) { - GtkTypeInfo camel_pop3_store_info = - { - "CamelPop3Store", - sizeof (CamelPop3Store), - sizeof (CamelPop3StoreClass), - (GtkClassInitFunc) camel_pop3_store_class_init, - (GtkObjectInitFunc) camel_pop3_store_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_pop3_store_type = gtk_type_unique (CAMEL_STORE_TYPE, &camel_pop3_store_info); - } - - return camel_pop3_store_type; -} - -static void -finalize (GtkObject *object) -{ - CamelException ex; - - camel_exception_init (&ex); - pop3_disconnect (CAMEL_SERVICE (object), &ex); - camel_exception_free (&ex); -} - - -static CamelServiceAuthType password_authtype = { - "Password/APOP", - - "This option will connect to the POP server using the APOP " - "protocol if possible, or a plaintext password if not.", - - "", - TRUE -}; - -static GList -*query_auth_types (CamelService *service) -{ - GList *ret; - - ret = g_list_append (NULL, &password_authtype); - return ret; -} - -static void -free_auth_types (CamelService *service, GList *authtypes) -{ - g_list_free (authtypes); -} - -/** - * camel_pop3_store_open: Connect to the server if we are currently - * disconnected. - * @store: the store - * @ex: a CamelException - * - * The POP protocol does not allow deleted messages to be expunged - * except by closing the connection. Thus, camel_pop3_folder_{open,close} - * sometimes need to connect to or disconnect from the server. This - * routine reconnects to the server if we have disconnected. - * - **/ -void -camel_pop3_store_open (CamelPop3Store *store, CamelException *ex) -{ - CamelService *service = CAMEL_SERVICE (store); - - if (!camel_service_is_connected (service)) - pop3_connect (service, ex); -} - -/** - * camel_pop3_store_close: Close the connection to the server and - * possibly expunge deleted messages. - * @store: the store - * @expunge: whether or not to expunge deleted messages - * @ex: a CamelException - * - * See camel_pop3_store_open for an explanation of why this is needed. - * - **/ -void -camel_pop3_store_close (CamelPop3Store *store, gboolean expunge, - CamelException *ex) -{ - if (expunge) - camel_pop3_command (store, NULL, "QUIT"); - else - camel_pop3_command (store, NULL, "RSET"); - pop3_disconnect (CAMEL_SERVICE (store), ex); -} - -static gboolean -pop3_connect (CamelService *service, CamelException *ex) -{ - struct hostent *h; - struct sockaddr_in sin; - int port, fd, status, apoplen; - char *buf, *apoptime, *pass; - CamelPop3Store *store = CAMEL_POP3_STORE (service); - - if (!service_class->connect (service, ex)) - return FALSE; - - h = camel_service_gethost (service, ex); - if (!h) - return FALSE; - port = camel_service_getport (service, "pop3", POP3_PORT, "tcp", ex); - if (port == -1) - return FALSE; - - pass = g_strdup (service->url->passwd); - if (!pass) { - char *prompt = g_strdup_printf ("Please enter the POP3 password for %s@%s", - service->url->user, h->h_name); - pass = camel_session_query_authenticator (camel_service_get_session (service), - prompt, TRUE, - service, "password", - ex); - g_free (prompt); - if (!pass) - return FALSE; - } - - sin.sin_family = h->h_addrtype; - sin.sin_port = port; - memcpy (&sin.sin_addr, h->h_addr, sizeof (sin.sin_addr)); - - fd = socket (h->h_addrtype, SOCK_STREAM, 0); - if (fd == -1 || - connect (fd, (struct sockaddr *)&sin, sizeof(sin)) == -1) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - "Could not connect to %s (port %s): %s", - service->url->host, service->url->port, - strerror(errno)); - if (fd > -1) - close (fd); - g_free (pass); - return FALSE; - } - - store->ostream = camel_stream_fs_new_with_fd (fd); - store->istream = camel_stream_buffer_new (store->ostream, - CAMEL_STREAM_BUFFER_READ); - - /* Read the greeting, note APOP timestamp, if any. */ - buf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (store->istream)); - if (!buf) { - g_free (pass); - return -1; - } - apoptime = strchr (buf, '<'); - if (apoptime) { - int len = strcspn (apoptime, ">"); - - apoptime = g_strndup (apoptime, len); - } else - apoptime = NULL; - g_free (buf); - - /* Authenticate via APOP if we can, USER/PASS if we can't. */ - status = CAMEL_POP3_FAIL; - if (apoptime && apoptime[apoplen] == '>') { - char *secret, md5asc[32], *d; - unsigned char md5sum[16], *s; - - secret = g_strdup_printf("%.*s%s", apoplen + 1, apoptime, - pass); - md5_get_digest(secret, strlen(secret), md5sum); - g_free(secret); - - for (s = md5sum, d = md5asc; d < md5asc + 32; s++, d += 2) - sprintf(d, "%.2x", *s); - - status = camel_pop3_command(store, NULL, "APOP %s %s", - service->url->user, md5asc); - } - - if (status != CAMEL_POP3_OK ) { - status = camel_pop3_command(store, NULL, "USER %s", - service->url->user); - if (status == CAMEL_POP3_OK) { - status = camel_pop3_command(store, NULL, - "PASS %s", pass); - } - } - - if (status != CAMEL_POP3_OK) { - camel_exception_set (ex, - CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, - "Unable to authenticate to POP server."); - return FALSE; - } - - g_free (pass); - return TRUE; -} - -static gboolean -pop3_disconnect (CamelService *service, CamelException *ex) -{ - CamelPop3Store *store = CAMEL_POP3_STORE (service); - - if (!service->connected) - return TRUE; - - if (!service_class->disconnect (service, ex)) - return FALSE; - - /* Closing the buffered write stream will close the - * unbuffered read stream wrapped inside it as well. - */ - camel_stream_close (store->ostream); - gtk_object_unref (GTK_OBJECT (store->ostream)); - store->ostream = NULL; - store->istream = NULL; - return TRUE; -} - -static CamelFolder *get_folder (CamelStore *store, const gchar *folder_name, - CamelException *ex) -{ - if (!strcasecmp (folder_name, "inbox")) - return camel_pop3_folder_new (store, ex); - else { - camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID, - "No such folder `%s'.", folder_name); - return NULL; - } -} - -/** - * camel_pop3_command: Send a command to a POP3 server. - * @store: the POP3 store - * @ret: a pointer to return the full server response in - * @fmt: a printf-style format string, followed by arguments - * - * This command sends the command specified by @fmt and the following - * arguments to the connected POP3 store specified by @store. It then - * reads the server's response and parses out the status code. If - * the caller passed a non-NULL pointer for @ret, camel_pop3_command - * will set it to point to an buffer containing the rest of the - * response from the POP3 server. (If @ret was passed but there was - * no extended response, @ret will be set to NULL.) The caller must - * free this buffer when it is done with it. - * - * Return value: one of CAMEL_POP3_OK (command executed successfully), - * CAMEL_POP3_ERR (command encounted an error), or CAMEL_POP3_FAIL - * (a protocol-level error occurred, and Camel is uncertain of the - * result of the command.) - **/ -int -camel_pop3_command (CamelPop3Store *store, char **ret, char *fmt, ...) -{ - char *cmdbuf, *respbuf; - va_list ap; - int status; - - va_start (ap, fmt); - cmdbuf = g_strdup_vprintf (fmt, ap); - va_end (ap); - - /* Send the command */ - camel_stream_write (store->ostream, cmdbuf, strlen (cmdbuf)); - g_free (cmdbuf); - camel_stream_write (store->ostream, "\r\n", 2); - - /* Read the response */ - respbuf = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (store->istream)); - if (!strncmp (respbuf, "+OK", 3)) - status = CAMEL_POP3_OK; - else if (!strncmp (respbuf, "-ERR", 4)) - status = CAMEL_POP3_ERR; - else - status = CAMEL_POP3_FAIL; - - if (ret) { - if (status != CAMEL_POP3_FAIL) { - *ret = strchr (respbuf, ' '); - if (*ret) - *ret = g_strdup (*ret + 1); - } else - *ret = NULL; - } - g_free (respbuf); - - return status; -} - -/** - * camel_pop3_command_get_additional_data: get "additional data" from - * a POP3 command. - * @store: the POP3 store - * - * This command gets the additional data returned by "multi-line" POP - * commands, such as LIST, RETR, TOP, and UIDL. This command _must_ - * be called after a successful (CAMEL_POP3_OK) call to - * camel_pop3_command for a command that has a multi-line response. - * The returned data is un-byte-stuffed, and has lines termined by - * newlines rather than CR/LF pairs. - * - * Return value: the data, which the caller must free. - **/ -char * -camel_pop3_command_get_additional_data (CamelPop3Store *store) -{ - CamelStreamBuffer *stream = CAMEL_STREAM_BUFFER (store->istream); - GPtrArray *data; - char *buf; - int i, status = CAMEL_POP3_OK; - - data = g_ptr_array_new (); - while (1) { - buf = camel_stream_buffer_read_line (stream); - if (!buf) { - status = CAMEL_POP3_FAIL; - break; - } - - if (!strcmp (buf, ".")) - break; - if (*buf == '.') - memmove (buf, buf + 1, strlen (buf)); - g_ptr_array_add (data, buf); - } - - if (status == CAMEL_POP3_OK) { - /* Append an empty string to the end of the array - * so when we g_strjoinv it, we get a "\n" after - * the last real line. - */ - g_ptr_array_add (data, ""); - g_ptr_array_add (data, NULL); - buf = g_strjoinv ("\n", (char **)data->pdata); - } else - buf = NULL; - - for (i = 0; i < data->len - 2; i++) - g_free (data->pdata[i]); - g_ptr_array_free (data, TRUE); - - return buf; -} diff --git a/camel/providers/pop3/camel-pop3-store.h b/camel/providers/pop3/camel-pop3-store.h deleted file mode 100644 index a4373a884a..0000000000 --- a/camel/providers/pop3/camel-pop3-store.h +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-pop3-store.h : class for an pop3 store */ - -/* - * Authors: - * Dan Winship <danw@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. (www.helixcode.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - - -#ifndef CAMEL_POP3_STORE_H -#define CAMEL_POP3_STORE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include "camel-types.h" -#include "camel-store.h" - -#define CAMEL_POP3_STORE_TYPE (camel_pop3_store_get_type ()) -#define CAMEL_POP3_STORE(obj) (GTK_CHECK_CAST((obj), CAMEL_POP3_STORE_TYPE, CamelPop3Store)) -#define CAMEL_POP3_STORE_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_POP3_STORE_TYPE, CamelPop3StoreClass)) -#define IS_CAMEL_POP3_STORE(o) (GTK_CHECK_TYPE((o), CAMEL_POP3_STORE_TYPE)) - - -typedef struct { - CamelStore parent_object; - - CamelStream *istream, *ostream; - -} CamelPop3Store; - - - -typedef struct { - CamelStoreClass parent_class; - -} CamelPop3StoreClass; - - -/* public methods */ -void camel_pop3_store_open (CamelPop3Store *store, CamelException *ex); -void camel_pop3_store_close (CamelPop3Store *store, gboolean expunge, - CamelException *ex); - -/* support functions */ -enum { CAMEL_POP3_OK, CAMEL_POP3_ERR, CAMEL_POP3_FAIL }; -int camel_pop3_command (CamelPop3Store *store, char **ret, char *fmt, ...); -char *camel_pop3_command_get_additional_data (CamelPop3Store *store); - -/* Standard Gtk function */ -GtkType camel_pop3_store_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_POP3_STORE_H */ - - |