2002-05-08 Jeffrey Stedfast <fejj@ximian.com>
+ * camel-digest-store.c (digest_setv): Implemented.
+ (digest_getv): Implemented.
+
+ * camel-disco-store.c (disco_setv): Implemented.
+ (disco_getv): Implemented.
+
+ * camel-remote-store.c (remote_store_setv): Implemented.
+ (remote_store_getv): Implemented.
+
+ * camel-transport.c (camel_transport_class_init): Implemented.
+ (transport_setv): Implemented.
+ (transport_getv): Implemented.
+
+ * camel-store.c (store_setv): Implemented.
+ (store_getv): Implemented.
+
+ * camel-service.c (service_setv): Implemented.
+ (service_getv): Implemented.
+
* providers/pop3/camel-pop3-store.c (pop3_try_authenticate):
camel_pop3_engine_iterate doesn't return the state, it returns -1
on fail, 0 when finished processing request or >0 if more ops are
static void camel_digest_store_init (CamelDigestStore *obj);
static void camel_digest_store_finalise (CamelObject *obj);
-static CamelStoreClass *camel_digest_store_parent = NULL;
+static int digest_setv (CamelObject *object, CamelException *ex, CamelArgV *args);
+static int digest_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args);
+
+static CamelStoreClass *parent_class = NULL;
CamelType
static void
camel_digest_store_class_init (CamelDigestStoreClass *klass)
{
+ CamelObjectClass *object_class = (CamelObjectClass *) klass;
CamelStoreClass *store_class = (CamelStoreClass *) klass;
- camel_digest_store_parent = CAMEL_STORE_CLASS(camel_type_get_global_classfuncs (camel_store_get_type ()));
+ parent_class = CAMEL_STORE_CLASS(camel_type_get_global_classfuncs (camel_store_get_type ()));
/* virtual method overload */
+ object_class->setv = digest_setv;
+ object_class->getv = digest_getv;
+
store_class->get_folder = digest_get_folder;
store_class->rename_folder = digest_rename_folder;
store_class->delete_folder = digest_delete_folder;
}
+static int
+digest_setv (CamelObject *object, CamelException *ex, CamelArgV *args)
+{
+ /* CamelDigestStore doesn't currently have anything to set */
+ return CAMEL_OBJECT_CLASS (parent_class)->setv (object, ex, args);
+}
+
+static int
+digest_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args)
+{
+ /* CamelDigestStore doesn't currently have anything to get */
+ return CAMEL_OBJECT_CLASS (parent_class)->getv (object, ex, args);
+}
+
/**
* camel_digest_store_new:
#define CDS_CLASS(o) (CAMEL_DISCO_STORE_CLASS (CAMEL_OBJECT_GET_CLASS (o)))
-static CamelRemoteStoreClass *remote_store_class = NULL;
+static CamelRemoteStoreClass *parent_class = NULL;
static void disco_construct (CamelService *service, CamelSession *session,
CamelProvider *provider, CamelURL *url,
CamelException *ex);
static gboolean can_work_offline (CamelDiscoStore *disco_store);
+static int disco_setv (CamelObject *object, CamelException *ex, CamelArgV *args);
+static int disco_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args);
+
static void
camel_disco_store_class_init (CamelDiscoStoreClass *camel_disco_store_class)
{
+ CamelObjectClass *camel_object_class =
+ CAMEL_OBJECT_CLASS (camel_disco_store_class);
CamelServiceClass *camel_service_class =
CAMEL_SERVICE_CLASS (camel_disco_store_class);
CamelStoreClass *camel_store_class =
CAMEL_STORE_CLASS (camel_disco_store_class);
-
- remote_store_class = CAMEL_REMOTE_STORE_CLASS (camel_type_get_global_classfuncs (camel_remote_store_get_type ()));
-
+
+ parent_class = CAMEL_REMOTE_STORE_CLASS (camel_type_get_global_classfuncs (camel_remote_store_get_type ()));
+
/* virtual method definition */
camel_disco_store_class->set_status = set_status;
camel_disco_store_class->can_work_offline = can_work_offline;
-
+
/* virtual method overload */
+ camel_object_class->setv = disco_setv;
+ camel_object_class->getv = disco_getv;
+
camel_service_class->construct = disco_construct;
camel_service_class->connect = disco_connect;
camel_service_class->disconnect = disco_disconnect;
camel_service_class->cancel_connect = disco_cancel_connect;
-
+
camel_store_class->get_folder = disco_get_folder;
camel_store_class->get_folder_info = disco_get_folder_info;
}
return camel_disco_store_type;
}
+static int
+disco_setv (CamelObject *object, CamelException *ex, CamelArgV *args)
+{
+ /* CamelDiscoStore doesn't currently have anything to set */
+ return CAMEL_OBJECT_CLASS (parent_class)->setv (object, ex, args);
+}
+
+static int
+disco_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args)
+{
+ /* CamelDiscoStore doesn't currently have anything to get */
+ return CAMEL_OBJECT_CLASS (parent_class)->getv (object, ex, args);
+}
+
static void
disco_construct (CamelService *service, CamelSession *session,
CamelProvider *provider, CamelURL *url,
{
CamelDiscoStore *disco = CAMEL_DISCO_STORE (service);
- CAMEL_SERVICE_CLASS (remote_store_class)->construct (service, session, provider, url, ex);
+ CAMEL_SERVICE_CLASS (parent_class)->construct (service, session, provider, url, ex);
if (camel_exception_is_set (ex))
return;
status = camel_disco_store_status (store);
if (status != CAMEL_DISCO_STORE_OFFLINE) {
- if (!CAMEL_SERVICE_CLASS (remote_store_class)->connect (service, ex)) {
+ if (!CAMEL_SERVICE_CLASS (parent_class)->connect (service, ex)) {
status = camel_disco_store_status (store);
if (status != CAMEL_DISCO_STORE_OFFLINE)
return FALSE;
/* Fall back */
store->status = CAMEL_DISCO_STORE_OFFLINE;
- CAMEL_SERVICE_CLASS (remote_store_class)->cancel_connect (service);
+ CAMEL_SERVICE_CLASS (parent_class)->cancel_connect (service);
}
static gboolean
}
- return CAMEL_SERVICE_CLASS (remote_store_class)->disconnect (service, clean, ex);
+ return CAMEL_SERVICE_CLASS (parent_class)->disconnect (service, clean, ex);
}
static CamelFolder *
#define CAMEL_DISCO_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_DISCO_STORE_TYPE, CamelDiscoStoreClass))
#define CAMEL_IS_DISCO_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_DISCO_STORE_TYPE))
+enum {
+ CAMEL_DISCO_STORE_ARG_FIRST = CAMEL_REMOTE_STORE_ARG_FIRST + 100,
+};
+
typedef enum {
CAMEL_DISCO_STORE_ONLINE,
CAMEL_DISCO_STORE_OFFLINE,
*
*/
+
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#define CSTRC(obj) (CAMEL_STORE_CLASS (CAMEL_OBJECT_GET_CLASS (obj)))
#define CRSC(obj) (CAMEL_REMOTE_STORE_CLASS (CAMEL_OBJECT_GET_CLASS (obj)))
-static CamelStoreClass *store_class = NULL;
+static CamelStoreClass *parent_class = NULL;
static void remote_construct (CamelService *service, CamelSession *session,
CamelProvider *provider, CamelURL *url,
static gint remote_recv_line (CamelRemoteStore *store, char **dest,
CamelException *ex);
+static int remote_store_setv (CamelObject *object, CamelException *ex, CamelArgV *args);
+static int remote_store_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args);
+
static void
camel_remote_store_class_init (CamelRemoteStoreClass *camel_remote_store_class)
{
/* virtual method overload */
+ CamelObjectClass *camel_object_class =
+ CAMEL_OBJECT_CLASS (camel_remote_store_class);
CamelServiceClass *camel_service_class =
CAMEL_SERVICE_CLASS (camel_remote_store_class);
- store_class = CAMEL_STORE_CLASS (camel_type_get_global_classfuncs (camel_store_get_type ()));
+ parent_class = CAMEL_STORE_CLASS (camel_type_get_global_classfuncs (camel_store_get_type ()));
/* virtual method overload */
+ camel_object_class->setv = remote_store_setv;
+ camel_object_class->getv = remote_store_getv;
+
camel_service_class->construct = remote_construct;
camel_service_class->connect = remote_connect;
camel_service_class->disconnect = remote_disconnect;
return camel_remote_store_type;
}
+static int
+remote_store_setv (CamelObject *object, CamelException *ex, CamelArgV *args)
+{
+ CamelService *service = (CamelService *) object;
+ CamelURL *url = service->url;
+ guint32 tag;
+ int i;
+
+ for (i = 0; i < args->argc; i++) {
+ tag = args->argv[i].tag;
+
+ /* make sure this arg wasn't already handled */
+ if (tag & CAMEL_ARG_IGNORE)
+ continue;
+
+ /* make sure this is an arg we're supposed to handle */
+ if ((tag & CAMEL_ARG_TAG) <= CAMEL_REMOTE_STORE_ARG_FIRST ||
+ (tag & CAMEL_ARG_TAG) >= CAMEL_REMOTE_STORE_ARG_FIRST + 100)
+ continue;
+
+ if (tag == CAMEL_REMOTE_STORE_SSL) {
+ /* set the ssl mode */
+ camel_url_set_param (url, "use_ssl", args->argv[i].ca_str);
+ } else {
+ /* error? */
+ continue;
+ }
+
+ /* let our parent know that we've handled this arg */
+ camel_argv_ignore (args, i);
+ }
+
+ return CAMEL_OBJECT_CLASS (parent_class)->setv (object, ex, args);
+}
+
+static int
+remote_store_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args)
+{
+ CamelService *service = (CamelService *) object;
+ CamelURL *url = service->url;
+ guint32 tag;
+ int i;
+
+ for (i = 0; i < args->argc; i++) {
+ tag = args->argv[i].tag;
+
+ /* make sure this is an arg we're supposed to handle */
+ if ((tag & CAMEL_ARG_TAG) <= CAMEL_REMOTE_STORE_ARG_FIRST ||
+ (tag & CAMEL_ARG_TAG) >= CAMEL_REMOTE_STORE_ARG_FIRST + 100)
+ continue;
+
+ if (tag == CAMEL_REMOTE_STORE_SSL) {
+ /* get the ssl mode */
+ *args->argv[i].ca_str = (char *) camel_url_get_param (url, "use_ssl");
+ } else {
+ /* error? */
+ }
+ }
+
+ return CAMEL_OBJECT_CLASS (parent_class)->getv (object, ex, args);
+}
+
static void
remote_construct (CamelService *service, CamelSession *session,
CamelProvider *provider, CamelURL *url,
{
CamelRemoteStore *remote_store = CAMEL_REMOTE_STORE (service);
- CAMEL_SERVICE_CLASS (store_class)->construct (service, session, provider, url, ex);
+ CAMEL_SERVICE_CLASS (parent_class)->construct (service, session, provider, url, ex);
if (camel_url_get_param (url, "use_ssl"))
remote_store->use_ssl = TRUE;
}
/* parent class connect initialization */
- if (CAMEL_SERVICE_CLASS (store_class)->connect (service, ex) == FALSE)
+ if (CAMEL_SERVICE_CLASS (parent_class)->connect (service, ex) == FALSE)
return FALSE;
store->ostream = tcp_stream;
store->timeout_id = 0;
}
- if (!CAMEL_SERVICE_CLASS (store_class)->disconnect (service, clean, ex))
+ if (!CAMEL_SERVICE_CLASS (parent_class)->disconnect (service, clean, ex))
return FALSE;
if (store->istream) {
#define CAMEL_REMOTE_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_REMOTE_STORE_TYPE, CamelRemoteStoreClass))
#define CAMEL_IS_REMOTE_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_REMOTE_STORE_TYPE))
+
+enum {
+ CAMEL_REMOTE_STORE_ARG_FIRST = CAMEL_STORE_ARG_FIRST + 100,
+ CAMEL_REMOTE_STORE_ARG_SSL,
+};
+
+#define CAMEL_REMOTE_STORE_SSL (CAMEL_REMOTE_STORE_ARG_SSL | CAMEL_ARG_STR)
+
typedef struct {
CamelStore parent_object;
struct _CamelRemoteStorePrivate *priv;
static gboolean service_disconnect(CamelService *service, gboolean clean,
CamelException *ex);
static void cancel_connect (CamelService *service);
-static GList * query_auth_types (CamelService *service, CamelException *ex);
-static char * get_name (CamelService *service, gboolean brief);
-static char * get_path (CamelService *service);
+static GList *query_auth_types (CamelService *service, CamelException *ex);
+static char *get_name (CamelService *service, gboolean brief);
+static char *get_path (CamelService *service);
+
+static int service_setv (CamelObject *object, CamelException *ex, CamelArgV *args);
+static int service_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args);
static void
camel_service_class_init (CamelServiceClass *camel_service_class)
{
+ CamelObjectClass *object_class = CAMEL_OBJECT_CLASS (camel_service_class);
+
parent_class = camel_type_get_global_classfuncs (CAMEL_OBJECT_TYPE);
-
+
+ /* virtual method overloading */
+ object_class->setv = service_setv;
+ object_class->getv = service_getv;
+
/* virtual method definition */
camel_service_class->construct = construct;
camel_service_class->connect = service_connect;
}
+static int
+service_setv (CamelObject *object, CamelException *ex, CamelArgV *args)
+{
+ CamelService *service = (CamelService *) object;
+ CamelURL *url = service->url;
+ gboolean reconnect = FALSE;
+ guint32 tag;
+ int i;
+
+ for (i = 0; i < args->argc; i++) {
+ tag = args->argv[i].tag;
+
+ /* make sure this arg wasn't already handled */
+ if (tag & CAMEL_ARG_IGNORE)
+ continue;
+
+ /* make sure this is an arg we're supposed to handle */
+ if ((tag & CAMEL_ARG_TAG) <= CAMEL_SERVICE_ARG_FIRST ||
+ (tag & CAMEL_ARG_TAG) >= CAMEL_SERVICE_ARG_FIRST + 100)
+ continue;
+
+ if (tag == CAMEL_SERVICE_USERNAME) {
+ /* set the username */
+ if (strcmp (url->user, args->argv[i].ca_str) != 0) {
+ camel_url_set_user (url, args->argv[i].ca_str);
+ reconnect = TRUE;
+ }
+ } else if (tag == CAMEL_SERVICE_AUTH) {
+ /* set the auth mechanism */
+ if (strcmp (url->authmech, args->argv[i].ca_str) != 0) {
+ camel_url_set_authmech (url, args->argv[i].ca_str);
+ reconnect = TRUE;
+ }
+ } else if (tag == CAMEL_SERVICE_HOSTNAME) {
+ /* set the hostname */
+ if (strcmp (url->host, args->argv[i].ca_str) != 0) {
+ camel_url_set_host (url, args->argv[i].ca_str);
+ reconnect = TRUE;
+ }
+ } else if (tag == CAMEL_SERVICE_PORT) {
+ /* set the port */
+ if (url->port != args->argv[i].ca_int) {
+ camel_url_set_port (url, args->argv[i].ca_int);
+ reconnect = TRUE;
+ }
+ } else if (tag == CAMEL_SERVICE_PATH) {
+ /* set the path */
+ if (strcmp (url->path, args->argv[i].ca_str) != 0) {
+ camel_url_set_host (url, args->argv[i].ca_str);
+ reconnect = TRUE;
+ }
+ } else {
+ /* error? */
+ continue;
+ }
+
+ /* let our parent know that we've handled this arg */
+ camel_argv_ignore (args, i);
+ }
+
+ if (reconnect) {
+ /* reconnect the service using the new URL */
+ if (camel_service_disconnect (service, TRUE, ex))
+ camel_service_connect (service, ex);
+ }
+
+ return CAMEL_OBJECT_CLASS (parent_class)->setv (object, ex, args);
+}
+
+static int
+service_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args)
+{
+ CamelService *service = (CamelService *) object;
+ CamelURL *url = service->url;
+ guint32 tag;
+ int i;
+
+ for (i = 0; i < args->argc; i++) {
+ tag = args->argv[i].tag;
+
+ /* make sure this is an arg we're supposed to handle */
+ if ((tag & CAMEL_ARG_TAG) <= CAMEL_SERVICE_ARG_FIRST ||
+ (tag & CAMEL_ARG_TAG) >= CAMEL_SERVICE_ARG_FIRST + 100)
+ continue;
+
+ switch (tag) {
+ case CAMEL_SERVICE_USERNAME:
+ /* get the username */
+ *args->argv[i].ca_str = url->user;
+ break;
+ case CAMEL_SERVICE_AUTH:
+ /* get the auth mechanism */
+ *args->argv[i].ca_str = url->authmech;
+ break;
+ case CAMEL_SERVICE_HOSTNAME:
+ /* get the hostname */
+ *args->argv[i].ca_str = url->host;
+ break;
+ case CAMEL_SERVICE_PORT:
+ /* get the port */
+ *args->argv[i].ca_int = url->port;
+ break;
+ case CAMEL_SERVICE_PATH:
+ /* get the path */
+ *args->argv[i].ca_str = url->path;
+ break;
+ default:
+ /* error? */
+ }
+ }
+
+ return CAMEL_OBJECT_CLASS (parent_class)->getv (object, ex, args);
+}
+
static void
construct (CamelService *service, CamelSession *session,
CamelProvider *provider, CamelURL *url, CamelException *ex)
#define CAMEL_SERVICE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_SERVICE_TYPE, CamelServiceClass))
#define CAMEL_IS_SERVICE(o) (CAMEL_CHECK_TYPE((o), CAMEL_SERVICE_TYPE))
+enum {
+ CAMEL_SERVICE_ARG_FIRST = CAMEL_ARG_FIRST + 100,
+ CAMEL_SERVICE_ARG_USERNAME,
+ CAMEL_SERVICE_ARG_AUTH,
+ CAMEL_SERVICE_ARG_HOSTNAME,
+ CAMEL_SERVICE_ARG_PORT,
+ CAMEL_SERVICE_ARG_PATH,
+};
+
+#define CAMEL_SERVICE_USERNAME (CAMEL_SERVICE_ARG_USERNAME | CAMEL_ARG_STR)
+#define CAMEL_SERVICE_AUTH (CAMEL_SERVICE_ARG_AUTH | CAMEL_ARG_STR)
+#define CAMEL_SERVICE_HOSTNAME (CAMEL_SERVICE_ARG_HOSTNAME | CAMEL_ARG_STR)
+#define CAMEL_SERVICE_PORT (CAMEL_SERVICE_ARG_PORT | CAMEL_ARG_INT)
+#define CAMEL_SERVICE_PATH (CAMEL_SERVICE_ARG_PATH | CAMEL_ARG_STR)
typedef enum {
CAMEL_SERVICE_DISCONNECTED,
CamelProvider *provider, CamelURL *url,
CamelException *ex);
+static int store_setv (CamelObject *object, CamelException *ex, CamelArgV *args);
+static int store_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args);
+
static void
camel_store_class_init (CamelStoreClass *camel_store_class)
{
CamelObjectClass *camel_object_class = CAMEL_OBJECT_CLASS (camel_store_class);
CamelServiceClass *camel_service_class = CAMEL_SERVICE_CLASS(camel_store_class);
-
+
parent_class = CAMEL_SERVICE_CLASS (camel_type_get_global_classfuncs (camel_service_get_type ()));
/* virtual method definition */
/* virtual method overload */
camel_service_class->construct = construct;
-
+
+ camel_object_class->setv = store_setv;
+ camel_object_class->getv = store_getv;
+
camel_object_class_add_event(camel_object_class, "folder_created", NULL);
camel_object_class_add_event(camel_object_class, "folder_deleted", NULL);
camel_object_class_add_event(camel_object_class, "folder_renamed", NULL);
return camel_store_type;
}
+static int
+store_setv (CamelObject *object, CamelException *ex, CamelArgV *args)
+{
+ /* CamelStore doesn't currently have anything to set */
+ return CAMEL_OBJECT_CLASS (parent_class)->setv (object, ex, args);
+}
+
+static int
+store_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args)
+{
+ /* CamelStore doesn't currently have anything to get */
+ return CAMEL_OBJECT_CLASS (parent_class)->getv (object, ex, args);
+}
static gboolean
folder_matches (gpointer key, gpointer value, gpointer user_data)
#include <camel/camel-object.h>
#include <camel/camel-service.h>
+enum {
+ CAMEL_STORE_ARG_FIRST = CAMEL_SERVICE_ARG_FIRST + 100,
+};
typedef struct _CamelFolderInfo {
struct _CamelFolderInfo *parent,
#include "camel-mime-message.h"
#include "camel-private.h"
+static CamelServiceClass *parent_class = NULL;
+
/* Returns the class for a CamelTransport */
#define CT_CLASS(so) CAMEL_TRANSPORT_CLASS (CAMEL_OBJECT_GET_CLASS(so))
+static int transport_setv (CamelObject *object, CamelException *ex, CamelArgV *args);
+static int transport_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args);
+
+
+static void
+camel_transport_class_init (CamelTransportClass *camel_transport_class)
+{
+ CamelObjectClass *camel_object_class = CAMEL_OBJECT_CLASS (camel_transport_class);
+
+ parent_class = CAMEL_SERVICE_CLASS (camel_type_get_global_classfuncs (camel_service_get_type ()));
+
+ /* virtual method overload */
+ camel_object_class->setv = transport_setv;
+ camel_object_class->getv = transport_getv;
+}
+
static void
camel_transport_init (gpointer object, gpointer klass)
{
}
+static int
+transport_setv (CamelObject *object, CamelException *ex, CamelArgV *args)
+{
+ /* CamelTransport doesn't currently have anything to set */
+ return CAMEL_OBJECT_CLASS (parent_class)->setv (object, ex, args);
+}
+
+static int
+transport_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args)
+{
+ /* CamelTransport doesn't currently have anything to get */
+ return CAMEL_OBJECT_CLASS (parent_class)->getv (object, ex, args);
+}
+
+
/**
* camel_transport_send_to:
* @transport: the transport
#define CAMEL_IS_TRANSPORT(o) (CAMEL_CHECK_TYPE((o), CAMEL_TRANSPORT_TYPE))
+enum {
+ CAMEL_TRANSPORT_ARG_FIRST = CAMEL_SERVICE_ARG_FIRST + 100,
+};
+
struct _CamelTransport
{
CamelService parent_object;