Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-3.0-or-later
2 : : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
3 : :
4 : : #define G_LOG_DOMAIN "valent-contact"
5 : :
6 : : #include "config.h"
7 : :
8 : : #include <gio/gio.h>
9 : : #include <libebook-contacts/libebook-contacts.h>
10 : : #include <libtracker-sparql/tracker-sparql.h>
11 : :
12 : : #include "valent-contact.h"
13 : :
14 : :
15 : : //
16 : :
17 : : TrackerResource *
18 : 3 : valent_contact_resource_from_econtact (EContact *contact)
19 : : {
20 : 6 : g_autoptr (TrackerResource) resource = NULL;
21 : 6 : g_autolist (EVCardAttribute) phone_numbers = NULL;
22 : 3 : g_autolist (EVCardAttribute) email_addresses = NULL;
23 : 3 : g_autolist (EVCardAttribute) urls = NULL;
24 : : // g_autolist (EVCardAttribute) postal_addresses = NULL;
25 : 3 : g_autoptr (EContactDate) birthdate = NULL;
26 [ + + ]: 3 : g_autofree char *vcard = NULL;
27 : 3 : static struct
28 : : {
29 : : EContactField field;
30 : : const char *property;
31 : : } contact_fields[] = {
32 : : {
33 : : .field = E_CONTACT_UID,
34 : : .property = "nco:contactUID",
35 : : },
36 : : {
37 : : .field = E_CONTACT_FULL_NAME,
38 : : .property = "nco:fullname",
39 : : },
40 : : {
41 : : .field = E_CONTACT_NICKNAME,
42 : : .property = "nco:nickname",
43 : : },
44 : : {
45 : : .field = E_CONTACT_NOTE,
46 : : .property = "nco:note",
47 : : },
48 : : #if 0
49 : : {
50 : : .field = E_CONTACT_PHOTO,
51 : : .property = "nco:photo",
52 : : },
53 : : #endif
54 : : };
55 : :
56 [ + - + - : 3 : g_return_val_if_fail (E_IS_CONTACT (contact), NULL);
- + - - ]
57 : :
58 : : /* NOTE: nco:PersonContact is used unconditionally, because it's the only
59 : : * class which receives change notification.
60 : : */
61 : 3 : resource = tracker_resource_new (NULL);
62 : 3 : tracker_resource_set_uri (resource, "rdf:type", "nco:PersonContact");
63 : :
64 : 3 : vcard = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_21);
65 : 3 : tracker_resource_set_string (resource, "nie:plainTextContent", vcard);
66 : :
67 [ + + ]: 15 : for (size_t i = 0; i < G_N_ELEMENTS (contact_fields); i++)
68 : : {
69 : 12 : const char *value = NULL;
70 : :
71 : 12 : value = e_contact_get_const (contact, contact_fields[i].field);
72 [ + + + - ]: 12 : if (value != NULL && *value != '\0')
73 : 6 : tracker_resource_set_string (resource, contact_fields[i].property, value);
74 : : }
75 : :
76 : 3 : birthdate = e_contact_get (contact, E_CONTACT_BIRTH_DATE);
77 [ + + ]: 3 : if (birthdate != NULL)
78 : : {
79 : 4 : g_autoptr (GDateTime) date = NULL;
80 : :
81 : 2 : date = g_date_time_new_local (birthdate->year,
82 : 1 : birthdate->month,
83 : 1 : birthdate->day,
84 : : 0, 0, 0.0);
85 [ + - ]: 1 : tracker_resource_set_datetime (resource, "nco:birthDate", date);
86 : : }
87 : :
88 : 3 : phone_numbers = e_contact_get_attributes (contact, E_CONTACT_TEL);
89 [ + + ]: 6 : for (const GList *iter = phone_numbers; iter != NULL; iter = iter->next)
90 : : {
91 : 3 : EVCardAttribute *attr = iter->data;
92 : 3 : g_autofree char *medium = NULL;
93 : 3 : g_autoptr (EPhoneNumber) number = NULL;
94 [ + - ]: 3 : g_autofree char *medium_iri = NULL;
95 : 3 : TrackerResource *medium_resource = NULL;
96 : 3 : const char *medium_type = NULL;
97 : :
98 [ + - ]: 3 : if (e_vcard_attribute_has_type (attr, "CAR"))
99 : : medium_type = "nco:CarPhoneNumber";
100 [ + + ]: 3 : else if (e_vcard_attribute_has_type (attr, "CELL"))
101 : : medium_type = "nco:MessagingNumber";
102 [ + - ]: 1 : else if (e_vcard_attribute_has_type (attr, "FAX"))
103 : : medium_type = "nco:FaxNumber";
104 [ + - ]: 1 : else if (e_vcard_attribute_has_type (attr, "ISDN"))
105 : : medium_type = "nco:IsdnNumber";
106 [ + - ]: 1 : else if (e_vcard_attribute_has_type (attr, "PAGER"))
107 : : medium_type = "nco:PagerNumber";
108 [ + - ]: 1 : else if (e_vcard_attribute_has_type (attr, "VOICE"))
109 : : medium_type = "nco:VoicePhoneNumber";
110 : : else
111 : 1 : medium_type = "nco:PhoneNumber";
112 : :
113 : 3 : medium = e_vcard_attribute_get_value (attr);
114 : 3 : number = e_phone_number_from_string (medium, NULL, NULL);
115 [ + - ]: 3 : if (number != NULL)
116 : 3 : medium_iri = e_phone_number_to_string (number, E_PHONE_NUMBER_FORMAT_RFC3966);
117 : : else
118 : 0 : medium_iri = g_strdup_printf ("tel:%s", medium);
119 : :
120 : 3 : medium_resource = tracker_resource_new (medium_iri);
121 : 3 : tracker_resource_set_uri (medium_resource, "rdf:type", medium_type);
122 : 3 : tracker_resource_set_string (medium_resource, "nco:phoneNumber", medium);
123 : 3 : tracker_resource_add_take_relation (resource,
124 : : "nco:hasPhoneNumber",
125 : 3 : g_steal_pointer (&medium_resource));
126 : : }
127 : :
128 : 3 : email_addresses = e_contact_get_attributes (contact, E_CONTACT_EMAIL);
129 [ + + ]: 4 : for (const GList *iter = email_addresses; iter != NULL; iter = iter->next)
130 : : {
131 : 1 : EVCardAttribute *attr = iter->data;
132 : 1 : g_autofree char *medium = NULL;
133 : 1 : g_autofree char *medium_iri = NULL;
134 : 1 : TrackerResource *medium_resource = NULL;
135 : :
136 : 1 : medium = e_vcard_attribute_get_value (attr);
137 : 1 : medium_iri = g_strdup_printf ("mailto:%s", medium);
138 : 1 : medium_resource = tracker_resource_new (medium_iri);
139 : 1 : tracker_resource_set_uri (medium_resource, "rdf:type", "nco:EmailAddress");
140 : 1 : tracker_resource_set_string (medium_resource, "nco:emailAddress", medium);
141 : 1 : tracker_resource_add_take_relation (resource,
142 : : "nco:hasEmailAddress",
143 : 1 : g_steal_pointer (&medium_resource));
144 : : }
145 : :
146 : : #if 0
147 : : postal_addresses = e_contact_get_attributes (contact, E_CONTACT_ADDRESS);
148 : : for (const GList *iter = postal_addresses; iter; iter = iter->next)
149 : : {
150 : : EVCardAttribute *attr = iter->data;
151 : : GList *values = e_vcard_attribute_get_values_decoded (attr);
152 : : g_autofree char *medium = NULL;
153 : : g_autofree char *medium_iri = NULL;
154 : : TrackerResource *medium_resource = NULL;
155 : : const char *medium_type = NULL;
156 : : uint8_t v = 0;
157 : :
158 : : if (e_vcard_attribute_has_type (attr, "DOM"))
159 : : medium_type = "nco:DomesticDeliveryAddress";
160 : : else if (e_vcard_attribute_has_type (attr, "INTL"))
161 : : medium_type = "nco:InternationalDeliveryAddress";
162 : : else if (e_vcard_attribute_has_type (attr, "PARCEL"))
163 : : medium_type = "nco:ParcelDeliveryAddress";
164 : : else
165 : : medium_type = "nco:PostalAddress";
166 : :
167 : : medium = e_vcard_attribute_get_value (attr);
168 : : medium_iri = g_strdup_printf ("mailto:%s", medium);
169 : : medium_resource = tracker_resource_new (medium_iri);
170 : : tracker_resource_set_uri (medium_resource, "rdf:type", medium_type);
171 : :
172 : : for (const GList *viter = values; viter != NULL; viter = viter->next)
173 : : {
174 : : const GString *decoded = values->data;
175 : : static const char *adr_fields[] = {
176 : : "nco:pobox",
177 : : "nco:extendedAddress",
178 : : "nco:streetAddress",
179 : : "nco:locality",
180 : : "nco:region",
181 : : "nco:postalcode",
182 : : "nco:country",
183 : : };
184 : :
185 : : if (v < G_N_ELEMENTS (adr_fields) && decoded->len > 0)
186 : : {
187 : : tracker_resource_set_string (medium_resource,
188 : : adr_fields[v],
189 : : decoded->str);
190 : : }
191 : :
192 : : v++;
193 : : }
194 : :
195 : : tracker_resource_add_take_relation (resource,
196 : : "nco:hasPostalAddress",
197 : : g_steal_pointer (&medium_resource));
198 : : }
199 : : #endif
200 : :
201 : 3 : urls = e_contact_get_attributes (contact, E_CONTACT_HOMEPAGE_URL);
202 [ + + ]: 4 : for (const GList *iter = urls; iter != NULL; iter = iter->next)
203 : : {
204 : 1 : EVCardAttribute *attr = iter->data;
205 : 1 : g_autoptr (GString) url = NULL;
206 : :
207 : 1 : url = e_vcard_attribute_get_value_decoded (attr);
208 [ + - + - ]: 1 : if (url != NULL && g_uri_is_valid (url->str, G_URI_FLAGS_PARSE_RELAXED, NULL))
209 : 1 : tracker_resource_add_uri (resource, "nco:url", url->str);
210 : : }
211 : :
212 : : return g_steal_pointer (&resource);
213 : : }
214 : :
|