Adapt libedata-cal to the new ESource API.
[platform/upstream/evolution-data-server.git] / calendar / libedata-cal / e-cal-backend-factory.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3  *
4  * Author:
5  *   Chris Toshok (toshok@ximian.com)
6  *
7  * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
8  */
9
10 #include <config.h>
11 #include <string.h>
12
13 #include "e-cal-backend.h"
14 #include "e-cal-backend-factory.h"
15 #include "e-data-cal-factory.h"
16
17 G_DEFINE_ABSTRACT_TYPE (
18         ECalBackendFactory,
19         e_cal_backend_factory,
20         E_TYPE_BACKEND_FACTORY)
21
22 static EDataCalFactory *
23 cal_backend_factory_get_data_factory (EBackendFactory *factory)
24 {
25         EExtensible *extensible;
26
27         extensible = e_extension_get_extensible (E_EXTENSION (factory));
28
29         return E_DATA_CAL_FACTORY (extensible);
30 }
31
32 static const gchar *
33 cal_backend_factory_get_hash_key (EBackendFactory *factory)
34 {
35         ECalBackendFactoryClass *class;
36         const gchar *component_name;
37         gchar *hash_key;
38         gsize length;
39
40         class = E_CAL_BACKEND_FACTORY_GET_CLASS (factory);
41         g_return_val_if_fail (class->factory_name != NULL, NULL);
42
43         switch (class->component_kind) {
44                 case ICAL_VEVENT_COMPONENT:
45                         component_name = "VEVENT";
46                         break;
47                 case ICAL_VTODO_COMPONENT:
48                         component_name = "VTODO";
49                         break;
50                 case ICAL_VJOURNAL_COMPONENT:
51                         component_name = "VJOURNAL";
52                         break;
53                 default:
54                         g_return_val_if_reached (NULL);
55         }
56
57         /* Hash Key: FACTORY_NAME ':' COMPONENT_NAME */
58         length = strlen (class->factory_name) + strlen (component_name) + 2;
59         hash_key = g_alloca (length);
60         g_snprintf (
61                 hash_key, length, "%s:%s",
62                 class->factory_name, component_name);
63
64         return g_intern_string (hash_key);
65 }
66
67 static EBackend *
68 cal_backend_factory_new_backend (EBackendFactory *factory,
69                                  ESource *source)
70 {
71         ECalBackendFactoryClass *class;
72         EDataCalFactory *data_factory;
73         ESourceRegistry *registry;
74
75         class = E_CAL_BACKEND_FACTORY_GET_CLASS (factory);
76         g_return_val_if_fail (g_type_is_a (
77                 class->backend_type, E_TYPE_CAL_BACKEND), NULL);
78
79         data_factory = cal_backend_factory_get_data_factory (factory);
80         registry = e_data_cal_factory_get_registry (data_factory);
81
82         return g_object_new (
83                 class->backend_type,
84                 "kind", class->component_kind,
85                 "registry", registry,
86                 "source", source, NULL);
87 }
88
89 static void
90 e_cal_backend_factory_class_init (ECalBackendFactoryClass *class)
91 {
92         EExtensionClass *extension_class;
93         EBackendFactoryClass *factory_class;
94
95         extension_class = E_EXTENSION_CLASS (class);
96         extension_class->extensible_type = E_TYPE_DATA_CAL_FACTORY;
97
98         factory_class = E_BACKEND_FACTORY_CLASS (class);
99         factory_class->get_hash_key = cal_backend_factory_get_hash_key;
100         factory_class->new_backend = cal_backend_factory_new_backend;
101 }
102
103 static void
104 e_cal_backend_factory_init (ECalBackendFactory *factory)
105 {
106 }